Unity3D行为树系统编程实现

Unity3D行为树系统编程实现。行为树在AI领域使用十分广泛,行为树的架构非常通用和便捷,在扩展性方面表现得更是非常好。我这里只讲关于如何实现行为树,跳过了基础的行为树概念。关于行为树的介绍和行为树概念请看《使用行为树behavior-tree实现游戏ai》这是业界一个前辈写的文章我只是代为转载。

很久没有写文章了,如果文笔弱请多见谅,随着工作的繁忙,写博客也是件奢侈的事情。在整理完代码后累得跟死猪一样,时间并不充裕,经历也有限,请各位期待更新的朋友多多见谅。行为树一直是我希望完善的一个系统框架,本身在2011年时就用在3DRPG里,但那是并不完善,只是个初级的产品。这次我彻彻底底把他完善成一个固定框架,可以直接拿来扩展使用。原本也这个行程也只是记在笔记本上,但最近有个英国的出版社发MAILL给我说有篇UNITY3D AI的书他们正在出版,要我做一下审阅和评论,于是看了几天审阅了段时间,里面大部分内容都是讲U3D里一个行为树插件RAIN如何使用,一项不喜欢使用插件的我看得我很不爽,因为文章大部分内容都是叙述使用过程没什么可看的。一念之下,一口气直接把行为树系统框架和行为树编辑器写了一遍。审阅和评论的事情没弄完,自己的行为树系统倒是写完了,罪过罪过。—–废话完毕。

我先把源码地址贴上,让大家可以边对着代码,边看我的文章。这样可以像下酒菜一样,边喝着啤(wen)酒(zhang),边吃着花(dai)生(ma)。 源码放在github上: https://github.com/luzexi/Unity3DAIBehaviorTree 如果你喜欢可以star或者follow下。

行为树系统实现:

1.我把行为树以BNode为基类节点。

2.BNode的一层子类为BNodeAction(行动基类),BNodeComposite(执行顺序基类),BNodeCondition(条件基类),BNodeDecorator(修饰基类)。

3.BNode基类节点的基本方法:OnEnter–进入事件,OnExist–退出事件,Excute–执行事件。子类可以通过重写这三个方法以达到实现自我功能。

4.节点的执行顺序是需要提前考虑的,我写了几个,比如顺序,选择,并行,随机,迭代。具体点:顺序–子节点中顺序执行直到结束如果遇到失败的节点就返回失败否则成功,选择–子节点中顺序执行直到遇到返回成功的节点,并行–顺序执行节点无论失败成功直到结束返回成功,随机–随机选择一个节点执行返回该节点的结果,迭代–顺序执行直到并连续成功N次就返回成功否则失败。

5.输入参数BInput是行为树系统的必要类实例,因为在运行行为树时,每个节点的执行对象需要依赖输入参数,每个项目的输入参数都不一样,所以你可以继承BInput扩展成你希望的输入参数,比如:TestInput里加入了hp,mp两个元素用来保存AI的对象状态,你也可以加入更多更复杂的元素,比如角色信息类,伙伴信息类等。

6.为了让行为树运用到项目里去,我们可以对BNodeAction,BNodeCondition,BNodeDecorator,进行扩展。继承书写的规则:继承子类必须在Game.AIBehaviorTree命名空间里,构造函数里最好对m_strName进行赋值,这样就能在行为树编辑器里看到你的扩展类和扩展命名,每个扩展的节点,如果有需要对变量进行编辑的,变量必须是public的,而且类型只限于int,float,bool,string四种。

7.行为树编辑器是行为树系统可用性的关键。我把行为树用目录结构的方式来实现,这样对于节点的增加,删除,切换,拖拽,体验都非常便捷。对于每个节点的编辑状态在选择该节点后会在编辑器的右下脚现实。编辑器还承载了保存,加载,以及对行为树的增加和删除,重命名的功能。如下图:

img

8.行为树数据存储。我用json格式来存储行为树,先前我用bytes来存,但发现因为扩展子类的变量经常性变化,所以用bytes来存常常会导致已编辑完成的数据无法重新编辑。所以我用了c#反射进行类与json变量的配对。

9.最后请大家注意,行为树不只是用来做AI的,比如开宝箱,掉落,物品使用都可以用行为树来做。

10.文档化数据,行为树有了编辑器似乎抛弃了xls,但我还是认为xls对于策划人员的数据编辑工作还是主流的,所以我接下来扩展的方向就是行为树编辑器xls化。

转载请注明出处: http://www.luzexi.com

· Unity3D, 前端技术

感谢您的耐心阅读

Thanks for your reading

  • 版权申明

    本文为博主原创文章,未经允许不得转载:

    Unity3D行为树系统编程实现

    Copyright attention

    Please don't reprint without authorize.

  • 微信公众号,文章同步推送,致力于分享一个资深程序员在北上广深拼搏中对世界的理解

    QQ交流群: 777859752 (高级程序书友会)