跟诸子学游戏 有限状态机FSM
有限状态机
http://wiki.unity3d.com/index.php/Finite_State_Machine
是指在不容阶段,会呈现不同的功能,这些状态是有限的,不重叠的,这样的系统在某一时刻一定会处于其所有状态的其中一个状态,此时它接收一部分允许的输入,产生一部分可能的响应,并且迁移到一部分可能的状态. 根据状态调用函数,map保存状态(key)和函数(value) 状态可以有子状态,状态里面包含tasks任务.
有限状态机包含两个部分①状态集(FSMState),状态一般使用枚举enum或者字符串string,子类继承状态集抽象类(FSMState),然后添加各种状态. ②状态管理机(FSMSystem),管理状态集子类的状态,基本可以称为:增删改查取.通过这些组合进行一系列复杂逻辑的操作,达到逻辑清晰,代码复用率高的效果.
5个元素: ①状态:当前处于什么状态.②事件:当前状态调用相同的函数方法,产出不同的功能.③条件:根据什么条件转换其他状态.④动作:条件触发状态,状态触发动作.⑤迁移:状态切换也叫做状态迁移,在update里面一直调用当前状态对应的方法,.

简单方式使用switch case 来开发,开发简单,缺点太多,不做讨论;
一般分为3个类 ,例如:
FSMState 状态基类,使用枚举记录有几种状态;使用枚举记录状态转换的条件;记录条件所对应的状态(map),增加/删除条件所对应的状态;根据当前条件得到状态;虚方法(可写可不写),例如:在进入这个状态之前做什么动作,在进入这个状态之后做什么动作;抽象方法(必须写,因为这些个事件是在逻辑帧update里面进行更新的),例如:发生什么动作/做什么事件,判断当前物体是否要进入另一个状态;
xxxState 状态子类,继承自FSMState ,初始化一些数据,实现抽象方法等,程序框架搭好之后,主要在这个地方进行.
FSMManager:状态机管理类,记录当前状态ID,记录当前状态所对应的条件.搭好状态对象执行的方法,切换状态的方法.
实际物体上面去调用FSMManager中搭好框架的方法.
例如代码:
实际物体上面执行的方法:



