【教程】Unity行为树插件behaviour trees制作敌人AI
这里是枫2,最近比较忙,先做个图文版,空了来做个视频版…………
看这个教程前首先大家要知道unity的行为树插件behaviour tree,如果不知道可以搜索,这方面的教程很多,我就不做了,总之就是一个可视化无代码做敌人AI的插件
教程的功能需要买两个内容,第一个是behaviour主插件,第二个是MovementPack,建议大家打折购买


AI逻辑
我要设计个AI,逻辑是这样的,当敌人发现范围内的player,就会靠近player,在靠近player足够近的时候,会攻击玩家,当玩家远离敌人的时候会拉脱战
我们就一步步来完善这个AI逻辑
挂上脚本
首先我们要在敌人身上挂上脚本,其中包含两个脚本


设置导航区域
关于导航的内容可以去查阅导航插件的相关教程,这里就简单说明下了
把需要导航的区域设置成导航static

菜单的Windows-AI-Nav.....打开导航窗口
在导航窗口里这样设置

上图切到Bake按钮,点击Bake区域,你地图上会有一片蓝色的区域,这个区域就是导航区域了,敌人可以在这个区域行动

注意:敌人如果挂的有Animator,rootmotion一定打勾,我之前遇到敌人无法移动,找了半天才发现这里没勾上

获得Player
我们可以自定义个脚本来获得player,这样算是最节约效能的了(比起大范围的Findtag来说,我也不推荐大量用find来查找,这种方式很耗性能)
我们可以为Player的脚本写个单例,目的是方便别的脚本能够很快找到角色,不知道啥是单例就直接看代码

一般角色之类的,因为游戏里只有一个,所以我们可以用单例声明这个角色,既然叫单例脚本,意思就是这个脚本不能在场景里出现两个,貌似这是很基础的知识了
单例写完后,怎么在别的脚本里获得player呢,你可以在别的脚本里写playerBoyManager.Instance就可以获得了
自定义一个行为树脚本,内容差不多照抄就行,行为树必须要符合这个格式,具体为社么这样写可以看官方文档,Sharedxxxxx变量是行为树插件安装后会自带的变量,这个脚本的主要目的就是把sharedValue值返回成player

在之前敌人上添加的节点里点OPEN,就可以打开行为树界面

我们可以在参数界面里设置一个叫做Player的参数,Type点开,改成GameObject

在Task界面找到刚才自定义的节点,拖出来连上Entry

此时你运行游戏,你会发现行为树的参数能获得角色了

当玩家在视野里会被敌人跟随
我们来加点节点

上图有两个新节点,当你加上Within Distance节点的时候,你会发现敌人周围多了个圈,这个圈的意思是,当Target(玩家)进入圈内,就会执行右边的节点
但是,如何告诉节点Target是玩家呢,刚才我们不是写了个自定义节点叫做获得Player了,并把Player的GameObject给了一个参数,所以我们按照下图设置就可以让敌人知道Player是谁了

Seek节点的意思是追角色,也有参数设置,具体大家自行研究了,但是需要注意的是,里面有个Target参数,需要指定给player
此时运行游戏,你会发现,当你进入区域后,敌人会对你紧追不舍,就算你脱离了区域,敌人依然追你,这个要怎么解决呢
脱战功能
点击如图节点,设置Abort Type为Self,再运行下游戏,就会发现你离开敌人区域后会脱战了

虽然很简单,但是这个是什么意思,这里就要说下Abort Type
这个可以理解成强行打断Sequence,默认是None
为None的时候,也就是不设置打断,比如运行到敌人追你,就会一直追,除非追到你否则不会停下来
为Self的时候,会打断自身,比如检测范围的节点为False时,就会打断节点,让敌人不追你了
Lower Priority,高优先级的Sequence为True,会打断低优先级执行高优先级,什么叫高优先级呢,在行为树里,左边的节点比右边的优先级高
Both,当然就是上面两个一起执行,即可以打断自己,也会被高优先级打断
脱战回到原点
我希望敌人脱战后可以回到自己的初始地点
创建一个V3变量,并在开始时存储角色的位置

修改节点,主要是增加了个Get Local Position节点,获得角色的位置

节点里的参数设置中,Target为空,意思就是Self,即自身,然后我们把这个节点传递给StartPos

后面的IDLE节点意思是挂起,等待角色进入范围,如果不加IDLE,这个行为树就运行结束了,但是此时的节点有问题,你会发现程序卡IDLE上了,所以我们进行一些修改和调试
我们的目的是,敌人没发现你时运行IDLE,发现你后开始SEEK

上面的节点多加了个Selector节点,以及将Idle左边的Sequence改成了Both模式,Selector的意思是,当第一个节点不成立时,会继续执行下一个,而Sequence设置成Both,就会不断检测角色是否进入区域,一旦进入打断右边低优先级的Idle
攻击主角
通过上面的内容,应该对节点都比较理解了,所以接下来会加快速度直接给答案

补充
如何让角色移动的时候播放行走动画?
可以在Animator里面设置参数WalkSpeed

给敌人一个脚本,注意需要引用using UnityEngine.AI;

在动画里设置一个混合动画(如果不会找别的教程)

这样敌人行动起来就可以播放动的动画了
敌人可能出现莫名其妙的自转?
下图位置打勾

如果觉得文章不错,欢迎三连,连的多以后分享更多教程