ai行为树理解起来其实是npc根据自身一些情况进行一些逻辑执行,而这些逻辑是我们使用ai行为树去实现的。
ai行为树需要一个寻路网格体边界体积,在ue引擎中,体积Actor分为多种,寻路网格体边界体积只是其中的一种。
关于其它的体积,可以在官网网站查看
通过上面的介绍,我们可以得知,这种体积可以生成一个角色可以移动的区域,实现自动寻路,而ai行为树会需要很多这种移动的行为,比如npc去寻找敌人并攻击。
可以在体积列表下找到寻路网格体边界体积
然后设置体积的缩放,让体积包围住整个可以移动的区域,按p键可以查看区域。
如果你需要一些动态物体的阻挡,那么需要将网格体更新设置成动态
在蓝图中使用导航数据
AI MoveTo节点使用
Pawn 需要自动移动的角色
Destination 一个明确的位置
Target Actor 一个明确的对象可以和位置二选一设置
Acceptance Radius 和目标的距离半径内
Stop on Overlap 进入目标半径后是否停止寻路
首先实现一个跟随主角的效果,只需要通过AI MoveTo节点,便可以实现设置跟随主角,设置定时器,更新位置即可,
我又有灵感,制作了另外一个版本,根据距离如果超过一定距离以后,再去跟随
实现随机位置移动,获取半径能氪抵达的随机位置,一种需要调用,另一种不需要
相关组件的介绍
要实现AI行为树去控制角色,那么需要创建几个文件:
AIController AI控制器,作为AI的入口,用来去驱动Pawn或Charactor的行为,修改设置在黑板里的数据。
在AI控制器内,可以添加一些AI感知组件,更好的处理一些操作。
使用AI控制器需要在角色蓝图上设置。
BehaviorTree 行为树里面主要行为控制,根据数据判断进行逻辑运行。ai控制器可以选择去使用哪个行为树去运行,你需要在ai控制器内指定运行的行为树
BlackboardData 黑板数据主要存储一些变量,AI控制器主要去修改,行为树用于去进行逻辑判断。黑板的数据需要在行为树内指定,然后才可以在行为树内使用。
行为树需要从根部向下添加选择器(Selector) 节点
合成(Composites) 节点是流控制的一种形式,决定了与其相连的子分支的执行方式。
- 选择器(Selector) 从左到右执行分支,通常用于在子树之间进行选择。当选择器找到能够成功执行的子树时,将停止在子树之间移动。举例而言,如果AI正在有效地追逐玩家,选择器将停留在那个分支中,直到它的执行结束,然后转到选择器的父合成节点,继续决策流。
- 序列(Sequence) 从左到右执行分支,通常用于按顺序执行一系列子项。与选择器节点不同,序列节点会持续执行其子项,直到它遇到失败的节点。举例而言,如果我们有一个序列节点移动到玩家,则会检查他们是否在射程内,然后旋转并攻击。如果检查玩家是否在射程内便已失败,则不会执行旋转和攻击动作
- 简单平行(Simple Parallel) 简单平行节点有两个"连接"。第一个是主任务,它只能分配一个任务节点(意味着没有合成节点)。第二个连接(后台分支)是主任务仍在运行时应该执行的活动。简单平行节点可能会在主任务完成后立即结束,或者等待后台分支的结束,具体依属性而定。
以上摘自官网 https://docs.unrealengine.com/4.27/zh-CN/InteractiveExperiences/ArtificialIntelligence/BehaviorTrees/BehaviorTreeQuickStart/
接下来的实现也是基于官方的,如果有需要,请移至官方查看。
任务可以在行为树上面的栏目选择创建
创建出来的任务,官方推荐使用BTT作为前缀
创建的任务中,添加事件接收执行AI,然后在后面可以执行一些逻辑,记得任务完成以后,要设置完成执行,不管成功不成功。
使用AI行为树实现官方案例
首先在黑板里面创建相应的变量
然后再ai角色蓝图内使用AI控制器
然后在AI控制器内设置使用行为树
然后增加视觉感知
设置检测中立方是因为按归属设置需要C++源码,然后在主角蓝图上面设置tag检测
在AI控制器中事件点击目标感知更新时回调
在更新时,判断是否为玩家标签,然后判断是否获取成功,设置分支
如果失败了,设置定时器,然后设置了每4s调用一次事件
如果获取了玩家角色实例,那么清除掉定时器,然后设置黑板的值。这样,行为树可以根据黑板的值进行逻辑运行。
注意这个黑板是黑板对象,不是黑板组件
然后行为树按照官方设置,注意节点右上角的数字,是当前的执行顺序。
根节点是选择跟
追逐玩家节点增加了一个装饰器黑板,观察器中止设置为both,是在黑板的值未改变之前,中止掉其它所有的执行,观察的值则是黑板上写的变量是否看到玩家,这个值改变时,会重新运行这个节点。
追逐玩家序列节点下面有三个任务,它们会按照顺序执行,找到玩家会朝向玩家,然后修改移动速度,并朝向玩家移动。
追逐玩家任务节点是我们自己实现的一个任务,在里面实现了对当前ai持有者的速度修改
然后就是第二个节点巡逻,第一个设置速度和位置,第二个节点朝向巡逻目标移动,移动成功后,等待3s-5s
第一个节点就是自定义任务,里面随机了一个可以移动到的节点,如果没有随机到的话,就原地移动。
接下里就是执行的问题
追逐玩家是需要黑板上的能够看到玩家这个值,如果这个值为false,会触发整个ai重新运行,然后直接跳到巡逻序列,巡逻序列会一直执行下去,直到能够看到玩家的值改变。
所以,追逐玩家,优先级最高,每次都是先运行,不可运行才会去巡逻,第十个等待在这个逻辑里面是运行不到的。