Esempio n. 1
0
    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);
        }
    }
Esempio n. 2
0
    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));
    }
Esempio n. 3
0
    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);
        }
    }
Esempio n. 4
0
    /// <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);
    }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
    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));
    }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
    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;
    }
Esempio n. 9
0
    // ========================================================================== //

    /* 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
        }
    }