游戏中的逻辑少不了用状态机。但是面对复杂的状态(比如战斗角色控制,复杂的UI状态控制等),用状态机模式是最合适不过的了。结合C#的特点,我对状态机模式进行了简化。
完善的fsm:
public abstract class FSM<T> : MonoBehaviour {
static System.Action FuncVoid = () => {};
protected static System.Action<T, object> DefaultTrigger = (t, p) => { };
public State state { get; private set; }
public string Name;
public void SetDefaultTrigger(System.Action<T, object> _SetTrigger) {
DefaultTrigger = _SetTrigger;
}
public class State {
public System.Action OnEnter = FuncVoid;
public System.Action OnTick = FuncVoid;
public System.Action OnExit = FuncVoid;
public System.Action<T, object> SetTrigger = DefaultTrigger;
public string Name { get; private set; }
public State(string name) {
Name = name;
}
}
public void setState(State _state) {
state.OnExit();
state = _state;
Name = state.Name;
state.OnEnter();
}
protected void doStart() {
if (state == null) {
state = initState();
state.OnEnter();
StartCoroutine(OnTick());
}
}
IEnumerator OnTick() {
while (true) {
state.OnTick();
yield return null;
}