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); }
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); }
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); }
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()); }
public void SetState(CFSM newState) { if (m_state != null) { m_state.ExitState(); } m_state = newState; if (m_state != null) { m_state.EnterState(this); } }
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); }
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); }
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); }
public override bool OnEnter(CFSM fsmEntity, CFSMEvent fsmEvent) { return(true); }
public override bool Process(CFSM fsmEntity, CFSMEvent fsmEvent) { return(true); }
virtual public void OnAwake_State(CObjectBase pScriptOwner, CFSM <EState, TestStateBase> pFSMOwner) { Debug.Log(IDictionaryItem_GetKey() + " " + nameof(OnAwake_State) + " pScriptOwner : " + pScriptOwner + " pFSMOwner : " + pFSMOwner); }