unity3d Ai 角色控制状态机设计

##一:需求 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的脚本化。

样例代码正在上传,传好之后分享在这里:(待续)

转载于:https://my.oschina.net/u/186074/blog/380411

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值