AI(未完待续)

相关文件

AI控制器

用于控制非玩家角色行动,UE4中的AI具有感知系统,即视听等感知组件

黑板

在对应黑板上录入的变量都会作为行为树的全局变量,其中的变量称作键,通过细节面板可以命名及指定键的类型

行为树

决定AI行为走向和思维模式的流程树,创建后有默认根节点,决定AI思维关系的主要是以下节点(来自官方文档)

25

可以理解为,选择器会从它的子树中选择能够执行的子树执行,直到子树执行结束,则回到选择器重新选择;序列则从左到右依次执行每个子树,直到遇到执行失败的节点则停止;简单平行的两个连接将并行处理,依据设置可以决定在主任务完成后结束或是等待支线任务完成才结束。

在节点上右击可添加对节点的装饰器,即需要满足装饰器的条件,才能够执行该节点

对于装饰器中的“观察者中止”一项,官方文档的说明如下:

33

此项针对的是装饰器修饰的节点A是否优先执行,若装饰器满足条件,选择self项时,即使A自身和A的子树在执行,两者也会中止执行,优先执行A节点;选择lower priority时,只有节点A右边的所有节点会中止执行,优先执行A节点及子树;选择both时,则同时中止A的子树和A右面的所有节点,优先执行A节点

寻路导航创建

所有AI寻路功能都需要创建寻路导航,可在主面板左上角的“放置actor”面板中找到“导航网格体边界体积”,放入场景中

1

调整体积大小,将需要建构导航的场景放入该体积

2

点击构造后生成类似如图的绿色地面区域,这片区域为AI导航有效的区域

3

实例:实现敌对NPC追踪角色移动

思路:使用AI控制器沿创建好的导航移动敌对NPC,目标为玩家控制的角色,并循环操作

关卡蓝图:实现进入该关卡时,所有敌方npc无条件执行“移动”节点,即无条件自动追逐玩家

8

敌对NPC角色蓝图:实现敌对NPC追逐玩家的效果,即动态追踪玩家并移动到玩家当前的位置

4

实例:实现敌对NPC的巡逻

思路:通过行为树和黑板,使AI控制器控制敌对NPC完成”巡逻——发现敌人则追逐——丢失目标则继续巡逻“

【以下为UE5试用版界面,可能与UE4有些许不同】

创造文件及名称:

17

巡逻AI控制器:

要使AI控制器具有视野范围就必须先具有感知组件

35

感知组件的细节配置如下

36

控制器事件蓝图内容如下

18

19

20

21

EnemyCharacter:

敌方NPC的角色蓝图,不需要写入额外的内容,一般只需要将移动组件的最大行走速度设置为比玩家角色稍慢即可,便于玩家角色能够甩开NPC的追逐

EnemyBoard:

23

其中只有TargetActor的键类型基类需要设为actor,其他两个键使用默认设置

24

EnemyBehaviorTree:

31

26

其中,改变行走速度(ChangeSpeed)和改变巡逻点(ChangeFollowPoint)两者为自行编写的任务蓝图,创建空白蓝图方法如下:

27

节点“发现敌人”的装饰器设置如下:

32

ChangeSpeed

28

ChangeFollowPoint

该蓝图中用到的新建变量如下

30

蓝图具体内容如下

29

实例:实现敌对NPC失去目标后尝试寻找玩家

思路:在实现巡逻的基础上通过为敌对NPC增加EQS(环境查询系统),实现玩家在离开敌对NPC感知范围后,NPC仍然会试图搜寻玩家位置

新创建的文件:

37

前置工作:在使用EQS之前,首先需要在项目设置中启用EQS

38

关于调试

在运行场景时,可使用键盘上的引号键【‘】呼出AI面板,在AI面板下按小键盘的4键,可查看AI的感知范围

34

动画序列与蓝图

过场动画制作

创建一个过场动画的关卡序列,命名并打开操作界面

9

新建一个相机剪切轨道,并且绑定用于拍摄过场动画的电影摄像机actor(或是直接在场景中选中指定相机,通过actor到sequencer直接添加),将相机移动到起始位置,添加变换轨道(或其他轨道)并在起始位置添加关键帧

制作动画时,其他actor也可添加移动轨道,详细在下一个子目录“动画轨道”中

10

多次移动相机到指定位置,并在轨道上添加相应的关键帧(场景中能够看到相机移动的轨迹呈现),最后调整动画结束的准线,结束修改并保存

12

11

当拍摄多个动画后,可将需要拼接的动画放入一个新的关卡序列中,上下移动调整轨道,左右移动调整播放顺序,并将结束准线对齐

13

多段动画中间可建立渐变轨道的关键帧,实现切换的淡入淡出

动画轨道

14

Actor到Sequencer:创建一个控制actor的轨道,在场景中选中的actor会优先显示在顶端**(创建actor后一般自带一个控制actor移动的transfrom轨道,也可以自己添加变换轨道)**

添加文件夹:可为多个轨道分类,放置于不同的文件夹下(好像没什么用的样子)

音频轨道:可在动画播放同时添加音频资产的播放

事件轨道:分为触发器和中继器(后者不常用),触发器轨道中添加了关键帧后,右键新建末端可新建图表事件,当时间轴移动到指定位置执行该事件

相机剪切轨道:用于添加相机轨道,使用actor到sequencer添加时也会自动创建

镜头轨道:用于拼接多个镜头的轨道,也可以实现多个动画序列之间的拼接

时间膨胀轨道:用于设置播放倍率的关键帧,实现部分慢镜头和快进

渐变轨道:添加动画的黑幕(1为全黑,0为透明),多个关键帧可实现淡入淡出

【注:如果在单独一个元件下添加轨道,则所有轨道都作为其子元件,该元件的组件也可以实现调用为子元件,同时,在单一元件下还能够创建可视性轨道,调整特定时间下的actor是否可见。

特别地,对于相机actor来说,需要先获取CameraComponent子元件才能够更改具体具体属性(如:曝光补偿等)】

相机晃动

【需要创建蓝图类-MatineeCameraShake文件】

振荡设置

振荡时长:振荡的总时长

振荡混入时间:振荡开始的时间

振荡混出时间:振荡结束的时间

旋转振荡:实现镜头的各方位旋转振荡(如决定上下振荡或者左右振荡,或者两者混合等)

位置振荡:实现镜头的移动性振荡(如决定相机位置前后振荡等)

FOV振荡:实现镜头的缩放性振荡(相机位置不变,只是镜头缩放)

具体蓝图使用

  1. 在需要使用的蓝图流程中加入以下结点

    15

  1. 在动画序列中相机组件下添加相机晃动子元件,可以拖拽缩放抖动条

    16

动画蓝图

打开某个骨骼/网格体/动画序列/物理模型时,可在右上角看到动画蓝图标识

【注:此处以第三人称游戏模板的小白人为例】

打开默认的动画图表【AnimGraph】,找到默认状态机,双击打开

5

状态机内部蓝图:

6-1

Entry为一个输入/起始点,Idle/Run节点为走或跑时,JumpStart、Loop、End分别为跳跃的开始,腾空,落地过程,四个节点分别播放不同的动画,双箭头为四个节点互相切换的条件(右键添加状态可添加节点,通过节点引线引出的新节点与原节点之间自带转换条件)

Idle/Run节点内部:

6-2

此处混合空间播放器节点下方为一段动画,具有三个白色关键帧(第一个与绿色关键帧重合),由绿色关键帧的位置(speed的大小)决定播放的动画,而在动画播放时,绿色关键帧如果未到达下一个白色关键帧,将循环播放上一个白色关键帧的动画

JumpStart、Loop、End节点内部:

【注:因为结构相同故而使用JumpStart作为范例】

6-3

由Idle/Run节点到JumpStart与从JumpLoop到JumpEnd节点的切换条件:

6-5

6-6

前者:判断角色是否在空中,如果是,转换到下一个节点(即JumpStart节点)

后者:判断角色是否不在空中,如果是,转换到下一个节点(即JumpEnd节点)

由JumpStart到JumpLoop与由JumpEnd到Idle/Run节点的转换条件:

6-4

判断前一个节点(JumpStart或JumpEnd)中动画资产播放的剩余时间是否小于0.1,如果是,则转换到下一个节点(JumpLoop或Idle/Run)

动画蓝图事件图表:

7