文/_Z

AI在游戏开发过程中一直都是被反复修改的一部分。随着游戏内容越来越丰富,难免会需要调整AI行为,所以我长久以来一直想有一个完全交给策划同志们编辑的游戏AI编辑器。

游戏AI自定义

我们考虑一下游戏实际逻辑AI,比如有这样一些需求:角色需要找寻一个自己能打得过的野怪并且避让某些打不过的大型野怪,或角色达到一定等级做一些特定行为等。这些行为加条件的组合肯定是依赖于角色本身已经实现了一些基本的功能,例如行走到指定位置,播放指定动作,寻路等,这些逻辑需要提前都实现好,这里不做说明。然后留给AI中的逻辑去调用合适的用户api。

还有就是用状态机还是行为树去实现?我感觉行为树更好一些。状态机在完成需求固定且状态比较少的时候可以用一下,一旦出现状态添加或删除就需要大动干戈了,而行为树的扩展性就很出色了。行为树大家能找到很多资料,大致上的内容就不说了。主要说一下这里的一些区别吧。

120007m7oqwx78hilkoixx.png
我这里把节点分成这4类:

·叶节点:可执行状态的节点,也就是主要的行为逻辑都需要在这个节点下实现。

另外3类节点是控制型节点:
 

  • ·顺序节点:顺序执行其子节点。
  • ·选择节点:通过计算子节点的权重随机选择一个节点。
  • ·并发节点:执行所有自己点。


这4类节点本身都有进入条件的检测。

为了更好的配合策划开发,我用XLua来调用游戏中的用户api。这是叶节点的XLua文件,控制节点的XLua文件也类似只是没有 update()和trigger()。脚本是外部调用的,首先会执行detect()判断这个节点的进入条件,当返回true的时候才会调用enter()。

·function detect()--节点的进入条件

·function enter()--进入后调用

·function update()--节点进行中(只有叶节点才有)

·function trigger()--外部事件触发后响应 (只有叶节点才有)

·function exit()--退出节点

120006j27yp7ir9e19rvz5.jpg
假如现在有这个需求:

有一个人每天上班一直工作到下班,下班的时候会有两种选择:直接回家或者去女友家,去女友家如果没有礼物需要先去礼品店购买一些礼物,有了礼物之后再去女友家与女友约会。这样一天就结束了。

先来看看这棵行为树:

120005g11j6lemuwzr8xbe.jpg
有了以上的树形图之后,我们打开Window-NodeEditor在编辑器下构造如下结构:

120003if78fif7rkfiy1z9.jpg
120001qg8tfve3f3282epj.jpg
这棵树结构最后导出json格式用于构造节点。

这棵树的执行效果是这样的:

120001wv82lzi6md6dggqh.jpg
这个任务的3步细节可以放在这棵树的三个顺序执行节点上,依次执行。

第一步寻路至NPC的XLua脚本如下:

120000fp9doq44e11xeeko.jpg
这个脚本执行了角色在地图上寻找该NPC的操作,注意这一个行为是个持续性的动作,在trigger方法中了外部事件“MoveFinish”即角色寻路完成的事件,在脚本到事件之后寻路NPC的行为完成,转而执行接下来的行为,接下来就是第二步。

120000yna909cqfqmeb5na.jpg
第二步的脚本作用是打开与该NPC对话的逻辑,同样的需要DialogFinish事件,最后是第三步完成对话。

115959ifkckpro0crrfd8h.jpg
NotifyServer方法是和服务器定义的通知消息,作用是告知服务器这个任务已经做完,服务器得知消息后处理后续的游戏逻辑。

这样整个简单的任务流程就走完了,通过行为树的设计方式实现任务系统,可以说是非常简洁易维护的。行为树任务系统在遇到非常复杂的任务细节时依然能够清晰的表达出来,关键之处在于任务细节能通过了行为节点很好的抽象封装起来。

via:游戏扶持by腾讯游戏学院

锐亚教育

锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛