private void Finish_State(EStateFinishType eStateFinishType) { CStateContainer pPrevState = p_pStateContainer_Current; if (_stack_Interrupt.Count > 0) { ENUM_STATE eStateInterrupted = _stack_Interrupt.Pop(); CStateContainer pNextState = _mapState[eStateInterrupted]; SetLeave_State(pNextState, eStateFinishType); SetInterruptResume_State(pNextState, pPrevState); SetCurrentState(eStateInterrupted); } else if (_queue_Waiting.Count > 0) { ENUM_STATE pStateWaiting = _queue_Waiting.Dequeue(); CStateContainer pNextState = _mapState[pStateWaiting]; SetLeave_State(pNextState, eStateFinishType); SetStart_State(_mapState[pStateWaiting], pPrevState, EStateStartType.Waited); SetCurrentState(pStateWaiting); } else { SetLeave_State(null, eStateFinishType); SetCurrentState(null); } }
protected void SetInterruptResume_State(CStateContainer pStartState, CStateContainer pInterruptedState) { if (_pCoroutine != null) { _pOwner.StopCoroutine(_pCoroutine); } _pCoroutine = _pOwner.StartCoroutine(pStartState.EventStart(pInterruptedState, EStateStartType.Interrupt_Resume, Finish_State)); }
protected void SetLeave_State(CStateContainer pNextState, EStateFinishType eStateFinishType) { if (p_pStateContainer_Current != null) { p_pStateContainer_Current.EventFinish(pNextState, eStateFinishType); if (_pCoroutine != null) { _pOwner.StopCoroutine(_pCoroutine); } _stack_PrevState.Push(p_eStateCurrent); } }
/// <summary> /// 현재 상태를 강제로 종료시키고 무조건 새 상태가 끼어듭니다. /// 새 상태가 끝나면 다음 상태는 강제로 종료시킨 상태입니다. /// </summary> /// <param name="eState"></param> private void Interrupt_State(ENUM_STATE eState) { ENUM_STATE ePrevState = p_eStateCurrent; CStateContainer pPrevState = p_pStateContainer_Current; if (pPrevState != null && eState.Equals(p_eStateCurrent) == false) { SetLeave_State(_mapState[eState], EStateFinishType.Interrupted); _stack_Interrupt.Push(ePrevState); } SetStart_State(_mapState[eState], pPrevState, EStateStartType.Interrupt); SetCurrentState(eState); }
public void EventFinish(CStateContainer pNextState, EStateFinishType eStateFinishType) { p_bIsWait = false; if (pNextState != null) { p_pStateInstance.OnFinish_State(pNextState.p_pStateInstance, eStateFinishType); } else { p_pStateInstance.OnFinish_State(null, eStateFinishType); } }
protected void SetStart_State(CStateContainer pStartState, CStateContainer pPrevState, EStateStartType eStateStartType) { if (_pOwner.gameObject.activeSelf == false) { return; } if (_pCoroutine != null) { _pOwner.StopCoroutine(_pCoroutine); } _pCoroutine = _pOwner.StartCoroutine(pStartState.EventStart(pPrevState, eStateStartType, Finish_State)); }
public IEnumerator EventStart(CStateContainer pPrevState, EStateStartType eStateStartType, System.Action <CLASS_STATE> OnFinishState) { p_bIsWait = true; if (pPrevState != null) { yield return(p_pStateInstance.OnStart_State(pPrevState.p_pStateInstance, eStateStartType)); } else { yield return(p_pStateInstance.OnStart_State(null, eStateStartType)); } OnFinishState(p_pStateInstance); }
private void SetCurrentState(CStateContainer pState) { if (_bIsDebug) { if (pState != null) { Debug.Log(nameof(SetCurrentState) + pState.IDictionaryItem_GetKey()); } else { Debug.Log(nameof(SetCurrentState) + " is Null"); } } p_pStateContainer_Current = pState; }
// ========================================================================== // /* protected - Override & Unity API */ /* protected - [abstract & virtual] */ // ========================================================================== // #region Private protected void SetCurrentState(ENUM_STATE eState, bool bNotExcute_IfSameState = true) { if (_bIsDebug) { Debug.Log("FSM)" + _pOwner.name + " " + nameof(SetCurrentState) + " eState: " + eState + " Try", _pOwner); } CStateContainer pState = _mapState[eState]; if ((bNotExcute_IfSameState && pState.Equals(p_pStateCurrent) == false) || bNotExcute_IfSameState == false) { _bIsExecute_Once = true; p_eStateCurrent = eState; SetCurrentState(pState); if (pState == null) { p_Event_OnChangeState.DoNotify(new FSM_Arg(eState, null)); } else { p_Event_OnChangeState.DoNotify(new FSM_Arg(eState, pState.p_pStateInstance)); } if (_bIsDebug) { Debug.Log("FSM)" + _pOwner.name + " " + nameof(SetCurrentState) + " eState: " + eState + " Success", _pOwner); } #if UNITY_EDITOR // if (_bIsDebug) UpdateDebugObject_InHierachy(); #endif } }