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