前言
今天给大家分享的是行为树实战训练营。我们会以空洞骑士的BOSS AI为例,为大家介绍行为树的系统实现
行为树,在游戏行业当中是我们实现游戏AI的一种方式。除此之外,我们还可以使用最简单的如:switch case、 if else实现最基本的游戏AI;复杂一点,我们可以使用状态机、分层状态机来实现游戏的AI
【资料图】
行为术在游戏AI的实践实现上,有它自己的优势。我会给大家分别介绍,各种游戏AI的实现方式。给大家做一个清晰的比较,帮助大家去选择适合自己游戏项目的游戏AI实现方式。
版权声明
本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
点赞、关注、分享可免费获得配套学习资源
点击观看完整视频
行为树详解
行为树:以模块化方式描述任务之间的切换
所谓的行为树,就是把一个怪物的行为拆分成若干个子行为。比如说,一个怪物的行为,拆分成攻击和巡逻等
详细的案例分析,请参考行为树实战训练营视频公开课
行为树的节点类型
行为树是由一个一个的节点构成的。我们对每一个节点赋予一定的功能。行为树的节点可以分成两大类:
控制节点
一棵行为树,所有的控制节点都是这棵行为树上的做非叶子节点
把行为树看成是一棵树,顶端的节点是树根,所有下方的绿色节点可以看作是树枝或者树干,灰色节点是叶子节点,所有的树枝或者是树干节点,我们都叫它控制节点
控制节点在行为树里面又可以分成两类,一类叫做组合节点,另外一类叫做条件节点
动作节点:
叶子节点相当于一棵树上的树叶,我们知道树叶是不会再分叉,它是这个整棵树的最末梢的节点
叶子节点代表了程序当中一个个的动作
行为树要点
行为树是由节点构成的,每个节点要想运作起来,它都必须要要有一个节点的状态,每个节点都必须处于处于三个状态之一:
Running,表示程序正在执行这个节点
Success,每个节点它可能会有一个执行结束,比如巡逻状态,目标从a点走到B点,如果已经走到B点,那么这个状态就是处于一个成功的状态
Failure,有一些节点是用来执行判定的。它可以判定当前这个角色是否看见敌人,如果看见,就是成功;如果没看见,就是处于失败状态
在真正的开发行为树的时候,我们通常不会直接使用那些现成的行为树节点,而是要对行为节点进行定制,在我们的训练营里面会带领大家去定制一个一个的行为树节点
节点可以进行组合,比如要完成一个NPC的一个攻击的AI
它需要先有一个检测节点检测附近是否有可以攻击的目标
当出现目标,需要追击这个目标,当目标处于可攻击范围,要对目标释放技能
一个组合节点,它包括了检测目标,移动到目标,实施攻击,三个子节点构成
3. 组合节点是怎样执行的?
组合节点执行的顺序:
从左到右
Priority/Random Selector除外
行为树常用控制节点简介
顺序节点
每一个节点,它都有运行成功或失败的状态,如果第一个节点运行成功了,它就会按照顺序去执行第二个节点,如果第二个节点也运行成功了,它就会执行第三个节点,如果这三个节点都执行成功了,那么就说明这个顺序节点执行成功
顺序节点的应用
当要实现的逻辑需要按照顺序执行时
顺序节点的逻辑关系类似于C/C++程序里面的与运算
2. 选择节点
相当于逻辑运算的或运算
如果选择节点当中的某个节点执行失败了,它会不会造成选择节点失败?
不会造成选择节点失败
如果第一个节点执行失败了,它会继续运行第二个节点;第二个节点如果运行失败,也不会造成选择节点失败,它会运行第三个节点
三个节点里面,当有一个节点运行成功,就说明这个选择节点的运行是成功的
3. 并行节点
程序当中同时执行多个行为的行为就是并行行为,这个时候可以用定型节点进行执行。当有N个子节点时可以通过添加一个并行节点,让他们并行执行
4. 装饰器节点
装饰节点,可以理解成一个修改节点。它会对一个节点的行为进行修改
类似于程序当中的否运算,比如原本一个节点的运行结果是成功,当给它做一个修饰节点之后,可以反转节点,把一个运行成功的节点反转成运行失败
装饰节点除了可以反转节点外,还可以重复执行节点,重新尝试节点,然后超时节点,强制失败节点
行为树实战
请用行为树实现以下敌人AI
当敌人看见玩家:
敌人进入追击状态
当敌人看不见玩家:
敌人进入巡逻状态
应该如何实现?
首先Entry表示敌人状态机的入口,然后进入到这个的selector
选择器,相当于或运算,如果前面的节点执行失败,那么就执行后面的节点,不会造成整个这个节点全部执行失败
节点的执行是按照优先级,从左往右排部的,首先它会执行左边Sequence顺序节点
顺序节点必须要一个一个执行,前面的执行成功才执行,如果前面的执行不成功,那么这个顺序节点就执行失败
数据节点执行失败,那么选择器节点就会选择另外一个分支来进行执行。
敌人的行为数假设为行为数,那么程序会怎么走呢?
首先选择器开始,走左边分支走到顺序节点,判定是否发现敌人,如果发现了,就会顺序的执行追击功能
如果没有发现敌人,那么这个顺序节点就执行失败了,执行失败以后就返回回去,然后选择器就会选择巡逻状态来进行执行
2. 行为树看上去一切都很完美,是否是这样?
如果在这个行为书里面,我们不做特殊处理,那么当前面Sequence顺序节点分支没有发现这个敌人,那么sequence这个分支执行失败了。那么选择器就会选择右边节点进入巡逻节点,进入巡逻节点以后,它就会卡死在这个状态永远跳不出
即使在巡逻状态,也要执行左边这个分支。发现敌人节点的检测工作要一直执行,并且这个节点状态为true的时候,按顺序能够把巡逻节点给中断掉。让它中断掉再切回到顺序节点,发现敌人以后进入到追击状态
完美的行为树
必须能在巡逻和追击节点之间正常的切换
节点之间的切换需要利用行为树组合节点的ConditionAbort,中断机制
组合节点的中断机制
四种中断类型
None:不会产生中断
Self:当前组合任务还没运行完,所有子任务的OnUpdate会继续运行,检测是否发生中断
Lower Priority:同层且比自身优先级低级的任务还没运行完,所有子任务的OnUpdate会继续运行,检测是否发生中断
Both:Self+Lower Priority
请用行为树实现以下敌人AI
需要在行为树的Sequence节点设置打断,并且打断类型是Both
设置Both后就能满足行为树在追击和巡逻之间切换。具体可以分成两种情况来讨论:
看见敌人时:
行为树会执行黄色的分支,选择器选择左边Sequence节点,因为发现敌人因此进入到追击状态。
由于Self可以打断自身,它会一直不停的监控这个发现敌人这个条件节点。当这个条件节点为假时,Sequence节点可以打断自身的追击节点的执行,使Sequence节点进入失败状态,从而就进入到巡逻状态
看不见敌人时:
由于看不见敌人,发现敌人就为假,会造成Sequence失败,于是进入到巡逻状态
由于Sequence节点设置了Both,因此既能监控也可以打断自身的子节点追击,同时还可以打断比它低优先级的巡逻
节点会持续的监控是否会发现敌人,当敌人被发现的时,它会打断sequence右边比它低优先级的巡逻节点从而进入到追击状态
3. 中断类型设置Both后,左侧分支在看见敌人的情况下可以打断追击进入巡逻;在看不见的情况下可以打断巡逻,进入追击,这样就能实现一个完美的行为数
小测验
若将Sequence节点的中断类型设置为Lower Priority会有什么问题?
这个问题就不提供答案了,如果大家有什么不明白地方可以加一下文末的Alice老师,然后进群讨论,或者加我为好友讨论问题都是可以的
注意
Conditional Abort,只能由条件节点发起
Conditional Abort可以被任何的组合节点获取
行为树的优缺点
优点
易于理解并且可以使用可视化编辑器进行创建
很大的灵活性,非常强大,并且非常容易对其进行更改
能够创建由简单任务组成的非常复杂的任务,而不必要担心简单任务是如何实现的
每个行为逻辑互不影响,行为模块间的耦合度相对较低
2. 缺点
行为树的选择并不是最优的,结果也不一定是我们想要的。而且决策每次都要从根部往下判断行为节点,比状态机要耗费时间。每次决策都要经过大量的条件判断语句,会变得非常慢
如果AI对象就只有3个或以下数量的状态,用行为树设计的话,计算量会更大,反而会更耗费性能
面试与进阶
当面对一个客户端开发,包括服务器开发,因为游戏的AI也可以写在服务器上
如果是状态同步的游戏,写在服务器上,如果是真同步的游戏,是写在客户端上面
关于状态同步和帧同步的内容,我们的V I P课程里主程进价的项目框架是同时支持这两种数据同步模式的教学
2. 在我们进行面试和这个进阶的商业项目的应用开发的时候,我们需要去根本从根本上去理解底层,够熟练的运 用行为树:
理解行为树底层原理
能熟练运用行为树
能熟练拓展行为树节点
能熟练增加行为树节点
阅读过至少一种行为树系统源码
能够自己实现行为树框架
基于行为树的AI框架
3. 行为树的底层原理,我会在我们的VIP课程里面做行为树的源码解析,感兴趣的同学可以添加文末Alice老师的联系方式,并加入到我们的VIP课程当中去
写在最后
本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
更多学习资源请私信我获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
点赞、关注、分享可免费获得配套学习资源
X 关闭
Copyright © 2015-2022 亚洲字画网版权所有 备案号:豫ICP备20022870号-9 联系邮箱:553 138 779@qq.com