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; }