什么是FSM
FSM(Finite State Machine),无限状态机。一个状态机就是一个设备,具有有限的状态数量,在任何给定的时间根据输入和自己预先定好的状态转换规则,从一个状态跳转到另一个状态。一个有限状态机在同一时间只能处于某一个状态。
- 一个简单的例子:一个灯泡的开关就是一个状态机。该状态机有开状态(亮)和关状态(暗),当该状态机接受关闭输入的时候,灯泡从开状态转换到关状态,也就是灯泡会灭掉。当该状态机接受打开输入的时候,灯泡从关状态转换到开状态,也就是说灯泡会变亮。
从基类State说起
基类state可以是一个抽象函数也可以是一个纯虚函数,定义了四个行为方法:
entity:表示一个具有若干个状态的实体,比如npc在逃跑,ncp对应实体,逃跑对应状态。
- IntoState(T entity):
-
- 当进入该状态时调用的方法,只调用一次。
- 比如,要实现npc进入<逃跑>状态时,会尖叫一声,那么尖叫这个动作就可以在IntoState()方法里面实现
-
- Execute(T entity):
-
- 当进入该状态后每一帧都会调用的方法,该状态一般用来实现状态的跳转逻辑或者待在这个状态的持续时间的计数。
- 比如,npc处于<逃跑>状态时,逃到安全位置时,npc会跳转到<Idle>状态,这个逻辑可以在Execute()实现,if(没有威胁){切换状态到Idle;}
-
- Exit(T entity):
-
- 当从该状态切换到另一个状态之前,会调用该函数,只调用一次。
- 比如,想要实现npc从<逃跑>状态切换到<Idle>状态的时候,会做出一个擦冷汗的动作,可以在Exit()方法里面实现。
-
- OnMessage(T entity, Telegram msg):
-
- 当实体(entity)处于该状态时,刚好有消息(Telegram)发到该entity,会调用该方法。
- 比如,想要实现npc处于<逃跑>状态时,如果这时给npc发送一条摔倒的消息时,npc会感到绝望,并说“我要完蛋了”,可以在OnMessage()里面实现。总的来说,该方法可以实现实体(entity)处于某状态对某条特定的消息进行特殊的处理。
-
下面贴出基类state的代码
1 /// <summary> 2 /// 状态类的基类 3 ///