SimpleStateMachineTAddStateHandlers Method |
Namespace: KSPDev.ProcessingUtils
public void AddStateHandlers( T state, SimpleStateMachineTOnChange enterHandler = null, SimpleStateMachineTOnChange leaveHandler = null, bool callOnInit = true, bool callOnShutdown = true )
When the state is changed by setting the currentState property, the transition callbacks are only called when the state has actually changed.
Note, that the code must not expect that the handlers will be called in the same order as they were added. Each handler must be independent from the others.
class SimpleStateMachineFree { public enum State { One, Two, Three }; public void TestMachine() { var sm = new SimpleStateMachine<State>(strict: false); sm.AddStateHandlers( State.One, enterHandler: oldState => Debug.Log("Now in state ONE"), leaveHandler: newState => Debug.LogFormat("Going into state: {0}", newState)); sm.onBeforeTransition += (from, to) => Debug.LogFormat( "Before move: current={0}, new={1}", DbgFormatter.Nullable(sm.currentState), DbgFormatter.Nullable(to)); sm.onAfterTransition += (from, to) => Debug.LogFormat( "After move: old={0}, current={1}", DbgFormatter.Nullable(from), DbgFormatter.Nullable(sm.currentState)); sm.currentState = State.One; // Start the machine. // Logs: // Now in state ONE // Before move: current=NULL, new=One // After move: old=NULL, current=One sm.currentState = State.Two; // Logs: // Going into state: Two // Before move: current=One, new=Two // After move: old=One, current=Two sm.currentState = State.Three; // Logs: // Before move: current=Two, new=Three // After move: old=Two, current=Three sm.currentState = null; // Stop the machine. // Logs: // Before move: current=Three, new=NULL // After move: old=Three, current=NULL } }