##一:需求 RPG游戏中 角色,怪物的状态种类比较多, 因此需要对基本状态进行抽象,通过子类继承的方式来构建一个易于扩充的框架。
整体需求即是:
1:能够方便的构建新的AI
2:能够方便的增加 角色状态 3:状态代码之间 逻辑独立,修改不会产生副作用
##二设计 核心思想是构建一个基本的状态机,通过在每个状态中填充不同的逻辑代码,来构建不同的AI行为表现,同时通过组合不同的状态构建不同的状态机结构。
![在此输入图片描述][1] [1]: http://static.oschina.net/uploads/space/2015/0227/132157_jV0j_186074.png
首先确定有多少种大的AI状态,继承AIState 产生基本状态子类
![在此输入图片描述][2] [2]: http://static.oschina.net/uploads/space/2015/0227/132710_XN5A_186074.png
继承这些基础子状态,构建实际的AI状态
![在此输入图片描述][3] [3]: http://static.oschina.net/uploads/space/2015/0227/132947_KmCa_186074.png
##三接口设计和 进一步扩展性 接口设计: AICharacter是一个状态机,状态机的基本接口包括: AddState 初始化状态机结构,向状态机中添加状态逻辑; ChangeState 切换状态机状态;
AIState: 每个状态基本接口包括: EnterState 进入状态初始化 ExitState 退出状态 清理 RunLogic 状态逻辑 更新 CheckEvent 检测外部事件
我的AIState实现是主动检测外部事件类型的,也就是在状态循环中 不断检测是否有外部事件,如果有则进行事件处理;
还有一种AIState实现是 被动接受事件,当有事件发生,立即执行AIState中对特定事件的处理代码,这种方式的缺点是可靠的清理AIState的内部状态比较困难一些,第一种方式,RunLogic可以实现为Coroutine 协程, 这样代码逻辑清晰,只需要在代码逻辑中安全位置 插入 CheckEvent 调用即可 方便的清理状态。
潜在扩展性: 1:上面的设计分离了AI状态和实际的代码逻辑实现,当前的实现有两个缺点:
一个限制是 AI状态机同一时刻只能处于一种状态,如何扩充支持多层次独立状态,暂时没有考虑; 二是类似行为树这种机制属于AI决策部分,这部分如何和状态机进行结合没有考虑过,现在的实现是通过替换AIState实现来定制不同的AI。 2: 如何脚本化,要将AI逻辑实现做成脚本,只需要继承基本状态,构建一个特殊的具体AI状态,该AI状态添加一个AI脚本的配置,执行该AI状态时,去执行脚本逻辑代码,即可实现AI的脚本化。
样例代码正在上传,传好之后分享在这里:(待续)