游戏ai自定义--行为树+xlua+json

发表于2018-02-05
评论0 7.4k浏览
ai在游戏开发过程中一直都是被反复修改的一部分。策划短期内的需求随着游戏内容越来越丰富,难免会调整ai行为,所以我长久以来一直想有一个完全交给策划同志们编辑的游戏ai编辑器。

我们考虑一下游戏实际逻辑ai,比如有这样一些需求:角色需要找寻一个自己能打得过的野怪并且避让某些打不过的大型野怪,或角色达到一定等级做一些特定行为等。这些行为加条件的组合肯定是依赖于角色本身已经实现了一些基本的功能,例如行走到指定位置,播放指定动作,寻路等,这些逻辑需要提前都实现好,这里不做说明。然后留给ai中的逻辑去调用合适的用户api。
还有就是用状态机还是行为树去实现?我感觉行为树更好一些。状态机在完成需求固定且状态比较少的时候可以用一下,一旦出现状态添加或删除就需要大动干戈了,而行为树的扩展性就很出色了。行为树大家能找到很多资料,大致上的内容就不说了。主要说一下这里的一些区别吧。
我这里把节点分成这4类
·叶节点:可执行状态的节点,也就是主要的行为逻辑都需要在这个节点下实现。
另外3类节点是控制型节点
·顺序节点:顺序执行其子节点
·选择节点:通过计算子节点的权重随机选择一个节点
·并发节点:执行所有自己点
这4类节点本身都有进入条件的检测。

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

function detect()
	return true
end
function enter()
end
function update(dt)
end
function trigger(type,obj)
end
function exit()
end

假如现在有这个需求:
有一个人每天上班一直工作到下班,下班的时候会有两种选择:直接回家或者去女友家,去女友家如果没有礼物需要先去礼品店购买一些礼物,有了礼物之后再去女友家与女友约会。这样一天就结束了。
先来看看这颗行为树:
有了以上的树形图之后,我们打开Window-NodeEditor在编辑器下构造如下结构:
这颗树结构最后导出json格式用于构造节点

这颗树的执行效果是这样的:
下面是源码下载:资源下载(百度云)


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引