void _ChangeState(System.Type stateType, params object[] userdata) { if (typeof(FSMState).IsAssignableFrom(stateType)) { FSMState stateTo = GetState(stateType); if (stateTo) { if (stateTo.CallInit(userdata)) { FSMState stateFrom = (m_stackedStates.Count > 0) ? m_stackedStates.Peek() : null; if (stateFrom != null) { stateFrom.CallExit(stateTo); m_stackedStates.Pop(); } m_stackedStates.Push(stateTo); stateTo.CallEnter(stateFrom); if (stateFrom != null) { stateFrom.CallRelease(); } } else { Debug.LogError("FSM : state " + stateType.GetType().Name + " failed to initialize."); stateTo.CallRelease(); } } } }
void _Clear() { if (m_stackedStates.Count > 0) { FSMState currentState = m_stackedStates.Pop(); currentState.CallExit(null); currentState.CallRelease(); while (m_stackedStates.Count > 0) { FSMState stateFrom = m_stackedStates.Pop(); stateFrom.CallRelease(); } } }