FSM有限状态机
1、什么是有限状态机
2、定义有限状态机基类
public class FSMStateBase { //进入该状态时调用 public virtual void Enter() { } //每帧调用 public virtual void Update() { } //退出该状态时调用 public virtual void Exit() { } }
3、定义一组具体状态
public class IdleState : FSMStateBase { public override void Enter() { } public override void Update() { } public override void Exit() { } } public class WalkState : FSMStateBase { public override void Enter() { } public override void Update() { } public override void Exit() { } } public class AttackState : FSMStateBase { public override void Enter() { } public override void Update() { } public override void Exit() { } }
4、有限状态机使用示例
public class FSMManager : MonoBehaviour { public enum State { Walk, Idle, Attack } private State curState;//当前状态 private Dictionary<State, FSMStateBase> fsmDict = new Dictionary<State, FSMStateBase>(); private void Start() { curState = State.Idle; InitState(); } //添加一组状态 public void InitState() { fsmDict.Add(State.Walk, new WalkState()); fsmDict.Add(State.Idle, new IdleState()); fsmDict.Add(State.Attack, new AttackState()); } //转移状态 public void ChangeState(State state) { fsmDict[curState].Exit(); curState = state; fsmDict[curState].Enter(); } private void Update() { //模拟转换条件 if (Input.GetKeyDown(KeyCode.A)) { ChangeState(State.Walk); } else if (Input.GetKeyDown(KeyCode.B)) { ChangeState(State.Attack); } fsmDict[curState].Update(); } }
5、最后