using System.Collections.Generic; namespace SemiColinGames { public interface IState { // Called automatically whenever this state is transitioned to. Should reset whichever // state-specific variables need resetting. public void Enter(); // Returns the name of the new state, or null if we should stay in the same state. public string Update(float modelTime, SneakWorld world, T input); } public class FSM { readonly Dictionary> states; public FSM(string initialStateName, Dictionary> states) { this.states = states; StateName = initialStateName; Transition(StateName); } public string StateName { get; private set; } public IState State { get; private set; } public void Update(float modelTime, SneakWorld world, T input) { string newState = State.Update(modelTime, world, input); if (newState != null) { Transition(newState); } } void Transition(string state) { StateName = state; IState newState = states[state]; State = newState; State.Enter(); } } }