学习位置
- B站位置:红豆丨泥 UE AI 教程
- 原作者Youtube位置:https://youtu.be/-t3PbGRazKg?si=RVoaBr4476k88gct
- 素材自备
提前将动画素材准备好
- 斧头蓝图
- 斧头武器插槽
- 混合空间
- 就是改了一下第三人称模版的动画蓝图
行为树中不用Wait实现攻击完成
- 在敌人攻击事件中添加一个事件分发器,在蒙太奇播放完成或者失败的情况下进行事件通知
- 在攻击任务里面分派这个事件分发器的任务,只有攻击蒙太奇播完完成或者失败才完成任务
- 这样不用Wait也能正常攻击了
如果设置了Focus注视敌人没有注视玩家问题
- 应该是没有使用控制器进行旋转导致的问题
让AI沿着样条线巡逻
新建样条线
- 新建一个Actor作为样条线,新建一个增量巡逻路线的事件
Direction
为-1
就是表示向后移动,为1
就是向前移动
- 新建一个获取样条线世界坐标的点位置函数
- 敌人蓝图中添加这个样条线的实例对象
- 让敌人蓝图去选中样条线
添加跟着样条线移动任务
- 我们新建一个敌人AI的蓝图接口,这样我们就可以减少去使用
Cast
进行转换
- 将这个接口添加到敌人蓝图上
- 然后实现这个接口的函数,将样条线返回
- 新建一个任务,让AI去沿着样条线移动
- 行为树运行
- 将
Use Fixed Braking Distance for Paths
关闭后,AI移动到样条线之间的点就不会减速了
- 运行结果
让移动更加正常
- 添加一个枚举类型来标明状态
- 添加一个设置移动速度的接口函数
- 添加一个任务来设置速度
- 行为树逻辑
- 新建一个装饰器来判断当前AI有没有样条线Actor
添加AI状态进行攻击与巡逻切换
添加AI状态
- 添加一个枚举来表示AI的状态
- 添加老板键新建的这个枚举
- 设置行为树,状态为攻击的时候才去执行攻击任务,为消极的时候就执行巡逻任务
- 在AI控制器中设置两个函数用来转换当前AI的消极或者攻击状态
- 设置默认状态为巡逻状态
切换AI状态
- 在主角蓝图中按1来进行切换
- 我们将观察器中止设为自己,这样我们切换的时候就会立即停止当前观察器下的所有任务
- 但是因为移动到样条线任务中使用了AIMoveTo这个节点,它需要时间,就不会知道我们切换的任务,所以我们需要告知这个任务,中止时要做什么,直接停止移动
添加Montage行为动画
- 将准备斧头的事件添加一个Montage动画
- 添加一个不装备斧头的事件
- 创建一个不装备斧头的任务
- 行为树逻辑
解决Focus注视Bug
- 装备武器时不需要注视,进行巡逻样条线时不需要注视,要是没有样条线进入
Idle
状态也没有注视
感知系统
视觉感知状态
- 添加AI感知组件,视觉感知状态
- 蓝图中无法更改归属检测,所以得开启全部检测,C++中才能更改归属检测
- 按
'
开启行为树Debug模式,按小键盘4
键开启感知Debug模式
听觉感知状态
- 添加听觉感知状态
- AI的听觉感知有函数进行专门的通知,所以我们在角色蓝图中去通知AI的听力系统
- 运行结果
伤害感知状态
- 添加一个伤害感知状态
- 我们需要玩家对AI造成伤害,这个也是需要函数去通知的,因为有专门的AI伤害通知函数,伤害感知不会受到感知系统范围的约束,只要通知了伤害感知就AI就会知道
- 运行结果
让AI拥有感官去做一些行为
-
添加一个枚举作为AI感官的状态
-
添加一个可以让感官知道Actor的函数,首先获取到Actor的感官信息,然后进行遍历它受到刺激的感官,然后与当前AI有的感官进行匹配,如果有,就返回成功与当前感官刺激物
-
通过感官更新时事件,获取当前Actor的刺激感官状态是否是和AI匹配的感官
-
添加一个函数用来执行视觉感官看到玩家就开始攻击
-
如果检测到自己的斧头Actor那就加标签,只检测玩家标签
视觉感官看到玩家攻击行为
- 创建一个函数来获取当前AI行为状态
- 然后在执行视觉感官攻击玩家的函数中添加判断当前状态是否可以攻击,然后只攻击玩家,这样就可以不用使用标签玩家了
- 不用使用玩家标签进行筛选了
听觉感官听到玩家的巡视行为
- 在黑板上新建一个侦察的位置老板键
- 新建一个设置侦察状态和获取侦察位置的函数
- 新建一个听觉感官听到声音之后的执行行为函数
- 执行听觉感官行为函数
- 新建一个任务,当敌人走到听觉感官的听到的位置后,巡视一下就要回复到样条线的巡视状态,也就是行为树中的Passive状态
- 行为树逻辑
- 添加一样条线在场景中来测试
- 测试结果
伤害感官受到玩家伤害的攻击行为
- 添加一个伤害感官受到玩家伤害的攻击行为函数,这里不像视觉那样去判断是不是看见的玩家的原因是因为AI受到攻击是玩家里面直接通知的,所以AI必定知道是谁攻击了它,它就可以直接获取到玩家Character
- 执行伤害感官行为函数
EQS(Environmental Query System)
- EQS(环境查询系统) 是 Unreal Engine 中强大且灵活的 AI 查询系统,允许 AI 根据环境因素做出决策。它通常被用于让 AI 在特定情况下选择最佳的行动位置或目标。
- EQS 支持多种查询类型,
距离查询
、路径查询
等,最常用的是距离测试
和路径测试
:- 距离测试:测试将返回项目
(Item)
和选择的距离(Distance To)
属性之间的直线距离。 - 寻路测试:测试可用于确定是否存在通向情境(或从其通出)的路径,通向(或来自)情境的路径开销有多高,或者路径有多长。
- 距离测试:测试将返回项目
添加EQS
- 添加一个格架
- 要EQS可视化我们得新建一个
EQSTestingPawn
蓝图
- 投入场景中
- 添加寻路测试,那么场景中不能到达的位置就是蓝色球能到达的就是绿色球
- 添加距离测试,越接近500,得分也就越高
- 如果最小范围设置300,就会过滤掉300即以内的范围的点
让AI绕着目标转圈
- 我们生成一个圆的环境检测
- 新建一个环境查询情景的蓝图
- 但是我们需要获取围绕的Actor目标,所以可以在AI的控制器设置攻击状态函数里面提升攻击目标变量
- 环境查询情景蓝图就可以获取到目标了
- 设置到EQS的圆测试上
- 测试,调用EQS
- 把样条线取消,这样AI就会围绕着角色转圈
- 运行结果
让AI转圈而不是随机沿对角线游走
- 任务:让AI转圈而不是随机沿对角线游走,而是AI只会沿着两个点走,并且更新这两个最近的点进行转圈
- 为了方便测试,我们在环境查询情景蓝图中设置目标为玩家出生地
- 添加一个寻路测试与距离测试,距离测试设置150-500,这样离测试Pawn小于150的距离的会被过滤掉,而测试Pawn走到那个点位,就正好只有旁边最近小于500的点位可以走
- 换回以玩家为目标EQS查询,进行测试
- 测试结果
让AI攻击一下然后再进行转圈
- 添加一个CD每十秒进行一次攻击
设置敌人攻击范围与绕圈的防御半径
- 让AI移动到理想位置然后进行攻击,当玩家不在AI的理想位置,AI又会移动理想位置
- 添加两个老板键用来表示攻击范围与绕玩家的圈的半径
- 在AI的接口蓝图中新建一个函数用来获取攻击范围与防御半径,然后在敌人蓝图中实现一下这个函数
- 在AI控制器中设置老板键的默认攻击距离与防御半径
- 创建一个装饰器来判断当前AI是否在理想的范围内
- 然后创建一个任务来移动到理想的范围
- 抒写行为树逻辑
- 之前默认移动到玩家目标也换成移动到理想位置
- 将判断是否在理想位置装饰器为低优先级,这样就可以中止当前任务并继续执行下一个优先级更低的任务,这样就可以打断AI正在执行移动到下一个点了
- 运行结果
让AI隐藏在掩体后面,然后出来攻击玩家
- 新建一个EQS用来检测掩体环境,用格架来检测,添加一个路径检测
- 把EQS的环境查询情景蓝图中测试打开
- 测试Pawn换上这个掩体检测的EQS
- 在EQS中添加一个追踪测试
- 再添加一个距离测试,设置为仅得分,然后是反向线性型,这样离AI越近的点得分越高,越远的点得分越低
- 行为树逻辑,添加一个新的Sequence测试一下这个EQS躲猫猫攻击行为
- 记得切换回玩家才是目标测试点
- 运行结果