Example #1
0
        ///Trigger a state to enter by it's name. Returns the state found and entered if any
        public FSMState TriggerState(string stateName, TransitionCallMode callMode)
        {
            var state = GetStateWithName(stateName);

            if (state != null)
            {
                EnterState(state, callMode);
                return(state);
            }

            Logger.LogWarning("No State with name '" + stateName + "' found on FSM '" + name + "'", LogTag.EXECUTION, this);
            return(null);
        }
Example #2
0
        ///Enter a state providing the state itself
        public bool EnterState(FSMState newState, TransitionCallMode callMode)
        {
            if (!isRunning)
            {
                Logger.LogWarning("Tried to EnterState on an FSM that was not running", LogTag.EXECUTION, this);
                return(false);
            }

            if (newState == null)
            {
                Logger.LogWarning("Tried to Enter Null State", LogTag.EXECUTION, this);
                return(false);
            }

            if (currentState != null)
            {
                if (onStateExit != null)
                {
                    onStateExit(currentState);
                }
                currentState.Reset(false);
                if (callMode == TransitionCallMode.Stacked)
                {
                    stateStack.Push(currentState);
                    if (stateStack.Count > 5)
                    {
                        Logger.LogWarning("State stack exceeds 5. Ensure that you are not cycling stack calls", LogTag.EXECUTION, this);
                    }
                }
            }

            if (callMode == TransitionCallMode.Clean)
            {
                stateStack.Clear();
            }

            previousState = currentState;
            currentState  = newState;

            if (onStateTransition != null)
            {
                onStateTransition(currentState);
            }
            if (onStateEnter != null)
            {
                onStateEnter(currentState);
            }
            currentState.Execute(agent, blackboard);
            return(true);
        }