FSM有限状态机的使用

FSM

F(finite):有限的
S(state):状态
M(Machine):机械
FSM(有限状态机):指在任意时刻都处于有限状态集合中的某一状态

  1. 我们在wiki.unity3d.com中搜索state


选择第二个,17kb大小的。打开以后,上边是源码,下边是案例。

  1. 我们复制上边的源码到我们的项目中,根据不同的需求,开始编写我们所需要的状态

  2. FSMState类:这个类表示有限状态系统中的状态。每个状态都有一个字典,其中有对(转换状态),显示如果一个转换被触发,而这个状态是当前状态,那么FSM应该是哪个状态。方法原因用于确定应该触发哪个转换。方法行为具有执行NPC在此状态下应该执行的操作的代码
    ①void AddTransition(Transition trans, StateID id):添加过渡
    ②void DeleteTransition(Transition trans):此方法从此状态映射中删除对转换状态。如果转换不在状态映射中,则打印一条错误消息
    ③StateID GetOutputState(Transition trans):如果该状态接收到一个转换,则此方法返回FSM的新状态
    ④:public virtual void DoBeforeEntering() { }:此方法用于在进入状态状态之前设置状态状态。在分配它之前,FSMSystem类会自动调用它到当前状态。
    ⑤:public virtual void DoBeforeLeaving() { }:此方法用于进行任何必要的操作,如重新设置变量在FSMSystem切换到另一个系统之前。它被自动调用通过FSMSystem切换到新的状态之前。
    ⑥:public virtual void Reason() { }:此方法决定状态是否应转换到其列表中的另一个状态NPC是这个类控制的对象的引用
    ⑦:public virtual void Act() { }:这个方法控制NPC在游戏世界中的行为。NPC做的每一个动作、动作或交流都应该放在这里NPC是这个类控制的对象的引用

  3. FSMSystem类:FSMSystem类表示有限状态机类。它有一个列表,其中包含NPC拥有的状态以及添加、删除状态和更改机器当前状态的方法
    ①public void AddState(FSMState s, Ctrl ctrl):此方法将新状态放置在FSM中,如果状态已经在列表中,则打印错误消息。第一个添加的状态也是初始状态。
    ②public void DeleteState(StateID id):如果状态存在,此方法将从FSM列表中删除该状态;如果状态不在列表中,则打印错误消息
    ③public void PerformTransition(Transition trans):此方法尝试根据当前状态和传递的转换更改FSM所处的状态。如果当前状态没有传递的转换的目标状态,则打印一条错误消息。

我们将需要的状态,添加到StateID枚举中,有可能发生的转换添加到Transition枚举中
例:我们有:MenuState、PlayState、PauseState、GameOverState等,这些类都需要继承自FSMState
我们在Awake()方法中:设置其对应的StateID,添加有可能发生的过渡转换。切换到当前状态之前需要的操作都实现在它父类的虚方法DoBeforeEntering() 中,当前状态离开之前需要的操作实现在DoBeforeLeaving() 中。
在我们程序初始化运行时,先初始化我们的各种状态,添加到集合中,并且设置默认的状态。

发布了3 篇原创文章 · 获赞 0 · 访问量 31

猜你喜欢

转载自blog.csdn.net/weixin_42593278/article/details/105481247
今日推荐