示例#1
0
    public SKStateMachine(T context, SKState <T> initialState)
    {
        this._context = context;

        // setup our initial state
        AddState(initialState);
        _currentState = initialState;
        _currentState.Begin();
    }
示例#2
0
    /// <summary>
    /// changes the current state
    /// </summary>
    public R ChangeState <R>() where R : SKState <T>
    {
        // avoid changing to the same state
        var newType = typeof(R);

        if (_currentState.GetType() == newType)
        {
            return(_currentState as R);
        }

        // only call end if we have a currentState
        if (_currentState != null)
        {
            _currentState.End();
        }

                #if UNITY_EDITOR
        // do a sanity check while in the editor to ensure we have the given state in our state list
        if (!_states.ContainsKey(newType))
        {
            var error = GetType() + ": state " + newType + " does not exist. Did you forget to add it by calling AddState?";
            Debug.LogError(error);
            throw new Exception(error);
        }
                #endif

        // swap states and call begin
        previousState = _currentState;
        _currentState = _states[newType];
        _currentState.Begin();
        elapsedTimeInState = 0f;

        // fire the changed event if we have a listener
        if (OnStateChanged != null)
        {
            OnStateChanged();
        }

        return(_currentState as R);
    }