protected virtual void StateMachineProcessState() { if (!_activeState && CurrentNode) { _activeState = gameObject.AddComponent(System.Type.GetType(CurrentNode.StateName)) as State; } if (_activeState) { State.StatePhase phaseOnStateProcessing = _activeState.CurrentPhase; switch (_activeState.CurrentPhase) { case State.StatePhase.ENTERING: { if (_oldStatePhase != _activeState.CurrentPhase) { _activeState.OnEnter(); } else { _activeState.EnterBehavior(); } break; } case State.StatePhase.ACTIVE: { _activeState.ActiveBehavior(); break; } case State.StatePhase.EXITING: { if (_oldStatePhase != _activeState.CurrentPhase) { _activeState.OnExit(); } else { _activeState.ExitBehavior(); } break; } case State.StatePhase.INACTIVE: { if (_oldStatePhase != _activeState.CurrentPhase) { StateNode requestedNextNode = _activeState.GetRequestedNextNode(); if (requestedNextNode) { CurrentNode = requestedNextNode; } else { CurrentNode = CurrentNode.NextNode; } } else { CurrentNode = CurrentNode.NextNode; } Destroy(_activeState); _activeState = null; break; } } _oldStatePhase = phaseOnStateProcessing; } }
protected virtual void StateMachineProcessState() { //Figure out what GameObject should be passed into state GameObject gameObjectToProccess = gameObject; if (ReleventGameObject) { gameObjectToProccess = ReleventGameObject; } //Start the queued state if active state is done. if (_activeState == null && _queuedNextState != null) { _activeState = _queuedNextState; } //Run state behavior for _activeState if (_activeState != null) { State.StatePhase phaseOnStateProcessing = _activeState.CurrentPhase; switch (_activeState.CurrentPhase) { case State.StatePhase.ENTERING: { if (_oldStatePhase != _activeState.CurrentPhase) { _activeState.OnEnter(gameObjectToProccess); } else { _activeState.EnterBehavior(gameObjectToProccess); } break; } case State.StatePhase.ACTIVE: { _activeState.ActiveBehavior(gameObjectToProccess); break; } case State.StatePhase.EXITING: { if (_oldStatePhase != _activeState.CurrentPhase) { _activeState.OnExit(gameObjectToProccess); } else { _activeState.ExitBehavior(gameObjectToProccess); } break; } case State.StatePhase.INACTIVE: { _activeState = null; break; } } _oldStatePhase = phaseOnStateProcessing; } }