Unreal Engine 5.1 AI行为树基础入门

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) 节点是流控制的一种形式,决定了与其相连的子分支的执行方式。

  1. 选择器(Selector) 从左到右执行分支,通常用于在子树之间进行选择。当选择器找到能够成功执行的子树时,将停止在子树之间移动。举例而言,如果AI正在有效地追逐玩家,选择器将停留在那个分支中,直到它的执行结束,然后转到选择器的父合成节点,继续决策流。
  2. 序列(Sequence) 从左到右执行分支,通常用于按顺序执行一系列子项。与选择器节点不同,序列节点会持续执行其子项,直到它遇到失败的节点。举例而言,如果我们有一个序列节点移动到玩家,则会检查他们是否在射程内,然后旋转并攻击。如果检查玩家是否在射程内便已失败,则不会执行旋转和攻击动作
  3. 简单平行(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重新运行,然后直接跳到巡逻序列,巡逻序列会一直执行下去,直到能够看到玩家的值改变。
所以,追逐玩家,优先级最高,每次都是先运行,不可运行才会去巡逻,第十个等待在这个逻辑里面是运行不到的。

猜你喜欢

转载自blog.csdn.net/qq_30100043/article/details/131173041