// enter state behaviour public virtual void Enter(AIStateInitializationData initData = null) { // if has parent and parent is not active, enter parent state if (_active) { return; } if (ParentState != null) { ParentState.OnReadyToTransitionState += SetReadyToTransition; ParentState.Enter(initData); } OnEnter(); }
// listener that changes AI State private void OnReadyToTransitionState(AIState nextState, AIStateInitializationData initData = null) { // exit the current state if (_currentState != null) { _currentState.Exit(nextState); _currentState.OnReadyToTransitionState -= OnReadyToTransitionState; } // if there is a state queue override, continue the queue instead if (_queuedStateList.Count != 0) { AIStateDataEntry entry = _queuedStateList.Dequeue(); SetNextState(entry.State, entry.Data); return; } SetNextState(nextState, initData); }
// fires ready to transition event for AI State Machine listener protected void SetReadyToTransition(AIState state, AIStateInitializationData initData = null) { OnReadyToTransitionState?.Invoke(state, initData); }
private void SetNextState(AIState state, AIStateInitializationData initData = null) { _currentState = state; _currentState.OnReadyToTransitionState += OnReadyToTransitionState; _currentState.Enter(initData); }