Esempio n. 1
0
    public void ChangeState(StateEnum stateName)
    {
        Debug.Log(_currentStateEnum + " -> " + stateName);

        StateData <StateEnum> current = _states[_currentStateEnum];

        //CHECK IF WE ARE MID TRANSITION
        if (_transitioning)
        {
            throw new Exception("Cannot change state while currently transitioning");
        }

        //LOCK STATE CHANGE
        _transitioning = true;

        //IF IN THIS STATE ALREADY
        if (_currentStateEnum.Equals(stateName))
        {
            return;
        }

        //CHECK STATE EXISTS
        if (_states.ContainsKey(stateName))
        {
            //CHECK NEW STATE IS LEGAL TRANSITION
            if (current.allowedStateTransitions != null)
            {
                bool transitionAllowed = false;
                for (int i = 0; i < current.allowedStateTransitions.Length; i++)
                {
                    if (current.allowedStateTransitions[i].Equals(stateName))
                    {
                        transitionAllowed = true;
                        break;
                    }
                }
                //NOT A LEGAL TRANSITION
                if (!transitionAllowed)
                {
                    Debug.Log("Cannot transition from state " + _currentStateEnum.ToString() + " to state " + stateName.ToString());
                    return;
                }
            }

            //SET LAST STATE AS OLD STATE IF IT WAS RESTORABLE
            if (current.canBeRestored)
            {
                _lastStateEnum = _currentStateEnum;
            }


            //CHECK FOR EXIT STATE CALLBACK
            if (current.OnExitStateCallback != null)
            {
                current.OnExitStateCallback();
            }

            //SET NEW STATE
            _currentStateEnum = stateName;

            //CHECK FOR ENTER STATE CALLBACK
            if (_states[stateName].OnEnterStateCallback != null)
            {
                _states[stateName].OnEnterStateCallback();
            }
        }
        else
        {
            Debug.Log("State: " + stateName.ToString() + " does not exist.");
        }

        //UNLOCK STATE CHANGE
        _transitioning = false;
    }