예제 #1
0
        public IEnumerator Controll_FSM_Inside_State_Test()
        {
            CFSM <EState, TestStateBase> pFSM = Init_FSMTest(EState.State_Attack);

            Assert.AreEqual(pFSM.p_eStateCurrent, EState.State_Attack);

            pFSM.DoEnqueueState(EState.State_Loop_1, EStateInsertType.Waiting);
            while (pFSM.p_eStateCurrent == EState.State_Attack)
            {
                yield return(null);
            }
            Assert.AreEqual(pFSM.p_eStateCurrent, EState.State_Loop_1);
            Assert.AreEqual(p_bIsLoop, true);

            // Loop는 내부에서 FSM을 통해 다시 Loop를 Enqueue하고 있으므로 무한으로 돕니다.
            while (pFSM.p_eStateCurrent == EState.State_Loop_1)
            {
                yield return(null);
            }
            Assert.AreEqual(p_bIsLoop, true);

            // 현재 State를 강제로 종료시킬 수 있습니다.
            pFSM.DoFinishCurrentState();
            Assert.AreEqual(p_bIsLoop, false);
        }
예제 #2
0
        public CStateContainer(CObjectBase pScriptOwner, CFSM <ENUM_STATE, CLASS_STATE> pFSMOwner, CLASS_STATE pState)
        {
            p_pScriptOwner   = pScriptOwner;
            p_pStateInstance = pState;
            p_eStateName     = pState.IDictionaryItem_GetKey();

            p_pStateInstance.p_pScriptOwner = pScriptOwner;
            p_pStateInstance.p_pFSMOwner    = pFSMOwner;

            p_pStateInstance.OnAwake_State(pScriptOwner, pFSMOwner);
        }
예제 #3
0
        private static CFSM <EState, TestStateBase> Init_FSMTest(EState eStateDefault)
        {
            GameObject pObject = new GameObject();
            CFSM <EState, TestStateBase> pFSM = new CFSM <EState, TestStateBase>();

            pFSM.DoInit(pObject.AddComponent <FSM_Test>(),
                        new State_Idle(), new State_Attack(), new State_Guard(), new State_Loop_1(), new State_Loop_2());

            pFSM.DoEnqueueState(eStateDefault, EStateInsertType.Change);

            return(pFSM);
        }
예제 #4
0
 private void InitFSM()
 {
     m_GameFSM = new CFSM();
     m_GameFSM.BindEntity(this);
     m_GameFSM.AddState(new CGameStateInstall());
     m_GameFSM.AddState(new CGameStateUpdate());
     m_GameFSM.AddState(new CGameStateLoading());
     m_GameFSM.AddState(new CGameStateInit());
     m_GameFSM.AddState(new CGameStateLogin());
     m_GameFSM.AddState(new CGameStateGame());
     m_GameFSM.AddState(new CGameStateDisconnect());
 }
예제 #5
0
    public void SetState(CFSM newState)
    {
        if (m_state != null)
        {
            m_state.ExitState();
        }

        m_state = newState;

        if (m_state != null)
        {
            m_state.EnterState(this);
        }
    }
예제 #6
0
        public override bool OnEnter(CFSM fsmEntity, CFSMEvent fsmEvent)
        {
            if (fsmEntity == null)
            {
                return(false);
            }
            CGameClient gameClient = fsmEntity.GetFSMBindEntity() as CGameClient;

            if (gameClient == null)
            {
                return(false);
            }
            gameClient.StartUpdate();
            return(true);
        }
예제 #7
0
    virtual public void OnAwake_State(CObjectBase pScriptOwner, CFSM <ENUM_STATE, CLASS_STATE> pFSMOwner)
    {
        _pScriptOwner = pScriptOwner;
        if (p_pExecuter_OnTransitionState == null)
        {
            p_pExecuter_OnTransitionState = new CExecuterList <CLASS_EXECUTER_TRANSITION_STATE>();
        }
        p_pExecuter_OnTransitionState.DoNotify_OnAwake(pScriptOwner);

        if (p_pExecuter_OnEnable == null)
        {
            p_pExecuter_OnEnable = new CExecuterList <CLASS_EXECUTER_ONSTART_STATE>();
        }
        p_pExecuter_OnEnable.DoNotify_OnAwake(pScriptOwner);
    }
예제 #8
0
        public IEnumerator State_Enumerator_Test()
        {
            CFSM <EState, TestStateBase> pFSM = Init_FSMTest(EState.State_Idle);

            Assert.AreEqual(pFSM.p_eStateCurrent, EState.State_Idle);

            // 1. Idle에서 2. Attack을 한다음 3. Guard를 순서대로 넣는다.
            pFSM.DoEnqueueState(EState.State_Attack, EStateInsertType.Waiting);
            pFSM.DoEnqueueState(EState.State_Guard, EStateInsertType.Waiting);
            // Wait이므로 현재는 Idle
            Assert.AreEqual(pFSM.p_eStateCurrent, EState.State_Idle);


            // 현재 상태(Idle)를 기다린 후에 체크하면 다음 상태인 2. Attack 상태가 된다.
            while (pFSM.p_eStateCurrent == EState.State_Idle)
            {
                yield return(null);
            }

            Assert.AreEqual(pFSM.p_eStateCurrent, EState.State_Attack);

            // Guard를 Interrupt하여 낀 후에 체크하면 현재 상태는 Guard가 된다.
            pFSM.DoEnqueueState(EState.State_Guard, EStateInsertType.Interrupt);
            Assert.AreEqual(pFSM.p_eStateCurrent, EState.State_Guard);


            // Guard를 기다리면 Interrupted당했던 2. Attack이 되돌아온다.
            while (pFSM.p_eStateCurrent == EState.State_Guard)
            {
                yield return(null);
            }
            Assert.AreEqual(pFSM.p_eStateCurrent, EState.State_Attack);


            // Attack을 기다리면 3. Guard가 된다.
            while (pFSM.p_eStateCurrent == EState.State_Attack)
            {
                yield return(null);
            }
            Assert.AreEqual(pFSM.p_eStateCurrent, EState.State_Guard);
        }
예제 #9
0
 public override bool OnEnter(CFSM fsmEntity, CFSMEvent fsmEvent)
 {
     return(true);
 }
예제 #10
0
 public override bool Process(CFSM fsmEntity, CFSMEvent fsmEvent)
 {
     return(true);
 }
예제 #11
0
 virtual public void OnAwake_State(CObjectBase pScriptOwner, CFSM <EState, TestStateBase> pFSMOwner)
 {
     Debug.Log(IDictionaryItem_GetKey() + " " + nameof(OnAwake_State) + " pScriptOwner : " + pScriptOwner + " pFSMOwner : " + pFSMOwner);
 }