【UE5】AI随机漫游蓝图两种实现方法(角色蓝图、行为树)

想要做一个AI随机漫游,有两种方法,一种是直接在AI角色蓝图中写,一种是使用行为树来移动。
用角色蓝图非常简单,但如果AI有复杂的行为,那么就需要使用行为树。
下面介绍两种方法如何使用。

一、基础设置

  • 制作AI角色蓝图
  • 添加AI控制器
  • 添加寻路网格体

角色蓝图是具体的动作逻辑。
控制器通过角色蓝图控制AI移动。
寻路网格体提供移动的场景。

1.制作AI蓝图

不管使用哪种方法,都要先建立一个AI的角色蓝图。
可以直接复制一个第三人称角色蓝图,这样比较快速。
简单介绍一下蓝图的各组件作用:

  • 胶囊体——控制碰撞
  • 网格体——控制骨骼、动画、材质
  • Camera Boom——控制摄像机视图
  • 角色移动组件——控制角色移动、游泳、飞行等动作
    在这里插入图片描述
    a.拷贝第三人称角色蓝图——删掉事件图表中所有的节点(因为AI不需要输入数据)
    在这里插入图片描述
    在这里插入图片描述

b.删除一些与输入有关的变量:“基础转动速率”、“基础俯仰速率”
在这里插入图片描述
在这里插入图片描述

c.删除摄像机组件:camera Boom(摄像机升降臂)、跟随相机
在这里插入图片描述

2.AI控制器

需要给AI蓝图绑定控制器,不然AI无法移动。
a.添加AI控制器 - 替换刚刚删除的玩家控制器的功能
b.建立AI控制器蓝图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
c.打开AI_ThirdPersonCharacter蓝图——PAWN——AI控制器类——绑定AI控制器蓝图
在这里插入图片描述
UE5这个界面里没有,可以在蓝图编辑器的细节面板中找到。
在这里插入图片描述

3.添加寻路网格体

没有寻路网格体,AI也无法移动。
a.添加寻路网格体
模式 - 寻路网格体(Nav Mesh Bounds Volume)拖入场景
在这里插入图片描述
“细节”面板调整笔刷尺寸。
在这里插入图片描述
让网格体覆盖AI需要行走的场景。
在这里插入图片描述
寻路网格体大小不需要特别准确。
b.显示网格体
视口选项 - 显示 - 导航(快捷键P)
在这里插入图片描述
在这里插入图片描述
绿色的就是寻路网格体

二、角色蓝图控制随机漫游

  • 自定义事件:AI通过控制器向某点移动
  • 获得随机目标点
  • 定时器循环漫游事件

原理:游戏开始后,产生一个计时器,并开始漫游事件——AI获得一个随机点,通过控制器移动到这个点——计时器开始计时,1.5s后AI前往下一个点——循环

给角色蓝图新建一个自定义事件,包含随机漫游逻辑 - 增加一个函数,在游戏中反复调用自定义事件。

1.AI行动

打开AI角色蓝图 - 在“事件图表”窗口右键创建“自定义事件custom event”,命名为“random wander随机漫游”。
在这里插入图片描述
在这里插入图片描述
“随机漫游”后跟“到Location的简单移动Simple Move To Location”函数。
在这里插入图片描述
“Get controller获取控制器”函数返回值与“到Location的简单移动”的controller参数连接。
在这里插入图片描述

2.随机点

“获取半径内能到达的随机点”起点为当前AI的位置:“获取Actor位置”函数的返回值连接origin (起点)
在这里插入图片描述
调整半径为1000。(看个人需求)
在这里插入图片描述
返回值与“到Actor的简单移动”的Goal参数连接。

在这里插入图片描述
完整如下:
在这里插入图片描述

3.定时器循环

创建“begin play”事件 - 连到“set timer by event以事件设置定时器”函数 。
在这里插入图片描述
random wander随机漫游事件连到“以事件设置定时器”函数的event引脚,设置开始时间time,勾选looping循环。
运行游戏,AI会在1.5s后随机漫游。

三、行为树控制随机漫游

  • 创建行为树、黑板
  • 控制器使用行为树
  • 行为树与黑板关联
  • 黑板创建向量存储随机点
  • 在任务蓝图中编写随机漫游逻辑
  • 行为树控制随机漫游

1.创建行为树、黑板

行为树一共有三个元素:

  • 行为树
  • 黑板
  • 任务蓝图

原理:1个行为会有2-3个动作,1个任务蓝图便是1个动作,黑板将任务蓝图的数值传递给行为树,行为树根据任务蓝图和黑板值控制AI的行为。

在内容栏里创建一个文件夹“BT_Assets”。
在这里插入图片描述
在文件夹中右键AI栏中创建一个行为树“BT_EnemyAI”,再创建一个黑板“BB_EnemyAI”。
在这里插入图片描述
在这里插入图片描述

2.AI使用行为树

打开AI控制器蓝图。
创建“Event On Posses事件控制时”事件。(AI被控制器控制时启动,其实就是开始游戏时启动)
拖拽执行引脚创建“Run Behavior Tree运行行为树”函数,在BTAsset下拉栏中选择BT_EnemyAI行为树。
在这里插入图片描述

3.黑板与行为树关联

打开行为树,在细节面板确认资产是否选择黑板
在这里插入图片描述

4.在黑板中创建条目保存目标点

在黑板创建一个向量变量来保存目标位置,作为新的漫游目的地
在行为树窗口切换为黑板。
在这里插入图片描述
在黑板选项卡新建一个“向量Vector”条目,命名为Target Location。
在这里插入图片描述

5.任务蓝图封装随机漫游逻辑

a.在行为树中新建任务BTTask_BluePrintBase,改名为“BTT_FindNavigatableLocation”。
在这里插入图片描述
在这里插入图片描述
新建文件夹来储存行为树任务,并打开任务蓝图 。
b.跟角色蓝图中的逻辑一样:
新建“Receive Execute AI事件接收执行AI” - 新建“获取可导航半径内的随机点Get random reachable point in radius”函数 ,半径改为1000 - “事件接受执行AI”事件的Controlled pawn引脚拖拽新建“获取actor位置”函数 - 获取actor位置的返回值与获取可导航半径内的随机点函数的Origin相连接。
在这里插入图片描述
c.处理随机参数的返回值
和之前的逻辑不同,一旦这个任务完成,它所包含的信息都会销毁。所以要把任务传给行为树,再传给黑板。
拖拽获取可导航半径内的随机点的random location新建“Set blackboard value as vector把黑板值设为向量”函数。 - 拖拽Key引脚并“提升为变量”,改名为Target Location Key。
在这里插入图片描述
并在我的面板中保证其为公开:因为要在行为树中操作。(名字要与黑板中的键相同,否则无法传递数值)
在这里插入图片描述
事件接受执行AI事件的执行引脚与将黑板值设为向量的执行引脚相连。
在这里插入图片描述
d.告诉行为树任务已完成
如果不告诉,任务会一直卡在这里。
将黑板值设为向量的执行引脚与“finish execut完成执行”函数的执行引脚相连 - 获取可导航半径内的随机点的返回值与完成执行的success引脚相连。
只要AI找到随机点,就判断成功。
在这里插入图片描述

6.创建行为树

AI行动顺序如下:

  • 找到随机目标点。
  • 向目标点移动。
  • 到达目标点后等待3s(等待是为了使行为更真实)

a.从根拖拽并添加一个sequence序列合成器
b.再添加一个sequnce合成,在细节面板改名为“随机漫游”
c.在sequence下从左到右添加之前创建过的任务、move to任务、wait任务。
在这里插入图片描述
在这里插入图片描述
d.BTT_FindNavigatableLocation并改名为“找到合适位置”,Target Location Key选取黑板键Target Location
在这里插入图片描述
e.Move To更改黑板键为Target Location
在这里插入图片描述

f.Wait并把等待时间改为3s
在这里插入图片描述

四、替换AI模型及动画问题

1.替换AI人物

现在替换AI模型。类型最好是Character而不是Actor,这样才能调用pawn。
在这里插入图片描述
如果没有编写蓝图,可以将模型蓝图直接拖入场景,boss就被导入了。
在这里插入图片描述
如果已经编写好了角色蓝图,则在细节面板的网格体处替换MESH。
还要在动画类选取动画序列。
在这里插入图片描述

2.人物平移问题

编写好boss蓝图后,发现boss在移动时在平移,而不是播放跑步动画。
a.找到BOSS动画蓝图。
在这里插入图片描述
b.找到Set is Accelerating一栏。
在这里插入图片描述
当前是获取的玩家的加速度,转换成向量,再转成长度。大于0则表示在加速。
但是我们的boss是个AI,并没有输入,所以需要获取当前AI的速度:
打断向量长度与0的判断。
在左边变量找到speed,按住ctrl拖入。
在这里插入图片描述
speed与0的判断相连。
在这里插入图片描述
再次运行游戏,boss移动时就会播放跑步动画了。

五、寻路原理

AI需要信息和数据才能在场景中移动并躲避障碍。
在场景中寻路是AI的基本功能,不仅仅是从A-B点。

  • 计算路径
  • 躲避障碍
  1. 寻路网格体 - 用于帮助AI在场景中寻路。网格体由大量凸多边形组成,规定了哪些区域AI可以通过。
    在这里插入图片描述
  2. 预计算数据

寻路网格体都是预先计算(“烘焙”)好的,这意味着在游戏开始前,以2D网格体形式表示的寻路网格体就已经包含了场景对象和AI自身生成的碰撞数据。这就使得寻路的开销更低。对于那些代理数量或类型不确定的实时体验来说,这点尤为明显。

寻路网格体开销低、速度快、高可靠,可以快速实现导航功能,但是场景无法动态修改寻路网格体。
在这里插入图片描述

六、调整寻路网格体

1.基础配置

自动更新改为手动更新。
a.默认网格体自动更新 - 移动场景物件,寻路网格体会实时更新。(若关卡较大,会很耗性能)
b.(仅对较大关卡)关闭自动更新 - 编辑器偏好设置 - 关卡编辑器 - 杂项 - 关闭自动更新导航
在这里插入图片描述
c. 手动更新 - 构建 - 导航 - 构建路径(无需在意日志里的错误消息)
在这里插入图片描述

2.高度、障碍

有时候我们需要一些高度或者障碍,这时候需要对寻路网格体进行一些属性上的调整,以应对复杂的需求。

创建寻路网格体时,Recast寻路网格体自动创建。
选中RecastNavMesh,在细节面板调整

  • 绘制偏移 - 抬升或降低寻路网格体。不会改变网格体实际位置,只是改变视觉效果。(对被遮挡的区域显示很有帮助)默认为10。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 导航修改器体积(Nav Modifer Volume) - 不会生成任何几何体。

在这里插入图片描述
在这里插入图片描述

  • 导航网格体障碍 - 表现某片区域难通过。AI不会优先选择这个路径。不会移除导航网格体。

在这里插入图片描述

  • NavArea_Null - 移除导航网格体,无法通过。 在这里插入图片描述
  • NavArea_LowHeight - 在高度不足的地方使用。无法通过。
    在这里插入图片描述
  • NavArea_Default - 可以通过。
    在这里插入图片描述

3.角色游泳、飞行的寻路网格体

如果想要尺寸更大、游泳、飞行的角色,只需要定义新的寻路网格体代理,并进行相应设置以适应新的尺寸和运动形式。

  • 代理 - 场景中任何形式的自主实体。这里泛指AI角色。
  • 在RecastNavMesh中调整代理参数,可打开AI蓝图的胶囊体参数对照调整。
    在这里插入图片描述
  • 代理高度 - 会出现高度不够,但是可以通行的状况。修改后,变为不可通过区域。
    在这里插入图片描述
    在这里插入图片描述
  • 增加代理类型和数量:项目设置 - 引擎 - 导航系统 - 代理

在这里插入图片描述

七、Gameplay调试

Gameplay调试器可以用来检测配置是否达到我们的要求,还可以用来检查问题出在哪一步。

1.调试寻路网格体

游戏运行后,按“ ’ ”打开控制台。

  • 可在项目设置 - 引擎 - 输入 - 控制台,添加快捷键
    在这里插入图片描述
    Gameplay debug“调试器”:检验AI能否在游戏中正确使用寻路网格体。
    运行游戏,按快捷键弹出Gamplay调试器,可以看到寻路网格体在不断更新
    在这里插入图片描述
    左上角 - 对应按键
    在这里插入图片描述
    AI信息,行为树
    在这里插入图片描述

2.调试行为树

以最快最有效的方式跟踪行为树的执行流程。
**a.**调试行为树信息
把玩家放在AI看不到的地方。
运行游戏。
打开行为树,选取AIC_ThirdPersonCharacter。
在这里插入图片描述

在这里插入图片描述
选取随机漫游的wait,F9打上断点。
在这里插入图片描述
也可以用返回执行上一个节点。
随着行为树越复杂,这个功能越好用。
在这里插入图片描述
b.使用Gameplay观察行为树
如果出包,或者屏幕有限,可使用Gameplay调试器。
运行游戏。
打开gameplay调试器。
按1隐藏AI信息,只显示行为树信息。
暂停游戏可观察具体流程信息、黑板信息。
在这里插入图片描述

八、行为树原理

AI最重要的环节 - 行为树。
借助行为树,可以轻松控制并显示AI的决策制定过程。

  • 行为树:是一种将AI在场景中决策制定模型可视化的方法。
  • 观察行为树的可视化结构,可以清晰地了解行为树的执行方式和执行顺序,而不必了解每个节点的具体工作方式
  • 执行顺序 - 由行为树中各个节点的位置决定。从上到下,从左到右。

1.任务节点

行为树的一种节点,下面无法添加其他节点。
是行为树分支的终点(但不是行为树的终点!)。
也被成为“叶节点”

  • 任务状态 - 分为:成功、失败、执行。
  • 无论失败与否,都会执行下一个节点。顺序从左到右

2.合成

合成是AI执行分支的根。不会像叶节点那样执行,但能创建一个结构,并根据其子节点的成败控制顺序。

  • 选择器合成 - 会执行它下面的子节点。
    试图选择最合适的任务 - 子节点返回成功,选择器成功。所有子节点返回失败,选择器失败。(只要有一个任务成功,则成功。所有任务失败,则失败。
    可以把优先级最高的任务放在左边。
  • Squencer合成
    序列合成节点会按照序列顺序遍历子节点,**当且仅当所有子节点返回成功,它才成功。**如果某个步骤执行失败,它失败。

3.结合

任务和合成可以创建出各种方法来处理AI的行为。
不必纠结如何完成任务,只需制定决策完成任务即可。

猜你喜欢

转载自blog.csdn.net/Zhanganzhen/article/details/124952661
今日推荐