最近在研究虚幻4引擎的EQS系统,看了下官方对EQS的解释文档(官方文档链接:https://docs.unrealengine.com/en-US/Engine/ArtificialIntelligence/EQS/index.html)及相关源码,熟悉了EQS在AI制作时的应用和使用,文章为本人学习之余所整理笔记,如有纰漏欢迎指正交流。

一、EQS原理:
EQS(Environment Query System),直译为环境查询系统,可以理解成对当前场景状态的扫描或者检查,往往配合AI行为树一起使用。其实现原理比较好理解,简单来说就是将场景环境划分,一般来说是按密度划分成一个一个点,当然也可以以场景元素Actor来进行划分,将环境划分好后,再按照相应的设定规则对划分项(点或Actor)进行打分,最后得分最高的Item即为系统所找到的最优查询结果。EQS系统将其最优查询结果告知AI,AI行为树则会对来其进行相应的决策及执行。

二、EQS组成部分:
使用EQS前我们最好知道EQS的都由哪些部分组成,各部分的分工都是什么。虚幻4官方文档对其各个组成部分的名词解释已较为详细,以下是本人对官方文档中名词解释的简单整理:

1.EnvironmentQuery(环境查询资产)
EQS资产,我的理解一个EQS资产就是一个可供AI使用的EQS实例。它相当于是一个容器,里面装着根据不同需求设计好的各种查询规则(即Genetators和Tests)。我们做好一个EQS资产后,最终,其会在AI的行为树节点中实例化,并在行为树节点运行时执行EQS相关功能,执行结果也会保存为黑板变量供行为树来决策使用。

2.Genetators(采样生成器)
采样生成器规定了我们EQS的采样点的生成规则。它以某一种规则在使用者周围进行参考点选取,将选取的采样点(可能是位置点也可能是Actor)用于测试。

如图,我们打开创建好的环境查询资产EnvironmentQuery后,在根节点下拉即可创建需要的Genetators。目前引擎提供的Genetators有以下这些:

Actors Of Class 采样场景中的Actor对象,按类型匹配,使用所匹配的Actor对象作为采样点(可以设置采样中心参照点及查询半径范围);
Composite 复合多种生成器,用来组合生成器使用;
Current Location 使用当前位置作为采样点;
Points Circle 环形点生成器,选取方式使用参考点向四周转圈发射射线。如果触碰到任何物体则将碰撞位置作为采样点,如无碰撞则以设定最大半径为采样点(可以设置采样查询半径及发射间隔角度);
Points Cone 锥形点生成器;
Points Donut 环状点生成器,区别于Circle,此生成器如同水波,一层一层向外扩散,直到最大半径;
Points Grid 简单的格子点生成器,不对采样点进行路径规则校验,导航不可达位置也将被收集;
Points Pathing Grid 路径格子点生成器,采样点必须是导航可达,需要满足导航规则校验;

3.Tests(测试规则)
测试规则的作用为对采样生成器找到的采样点进行打分或剔除,最后从通过所有测试规则的采样点中找到打分最高的采样点,即为EQS查找到的最优结果。当我们在EQS资产中创建好采样生成器Genetators之后,就可以在Genetators上添加各种Tests,目前引擎提供了一下Tests供使用:

Distance 距离测试,将采样点与参照内容进行距离测试,默认是距离越远分数越高,反之可将ScoringEquation设置为InverseLinear;
Dot 点乘测试,用于朝向方位打分,得分区间为0-1,默认正面为1背面为0,可勾选AbsoluteValue,正面、背面为1,左右两边为0;
Gameplay Tags 标签测试,用于根据Tag对采样点进行类型查询及剔除;
Overlap 通道测试,用于根据通道标记对采样点进行查询及剔除;
Pathfinding 寻路测试,将采样点与导航进行测试,可达则分数1,不可达为0,会返回一个可达的采样点;
Pathfinding Batch 批寻路测试,与上面不同的是它会返回所有可达点,供下个测试项目使用;
Project 投射测试,用于修正采样点位置,分为导航投射和碰撞投射;
Trace 射线测试,存在遮挡分数为1,不存在为0;
此外,用户也可以根据需要自己编写测试规则。
每个Tests还需设置其TestPurpose,即测试目的,有以下三种:

Score Only 仅打分,根据规则为采样点打分;
Filter Only 仅筛选,使用规则对采样点进行踢除,用于缩小测试范围,将符合筛选条件的进行保留,负责踢除;
Filter and Score 筛选并打分,综合上两种操作。
4.EnvQueryContext(查询内容)
查询内容可配置在Genetators或Tests上,在测试节点中,针对不同的测试方式需要选取不同的参照物进行测试参与。Context的功能便是提供参照物,拿采样得到的每一个点,分别与Context进行测试比较,然后将结果以分数形式标记于采样点。

EnvQueryContext默认提供了4种参照物返回方式:

Provide Single Location 提供一个三维向量在测试环节中与采样点进行比对;
Provide Single Actor 提供一个Actor在测试环节中与采样点进行比对;
Provide Location Set 提供一组Actor在测试环节中与采样点进行比对;
Provide Actors Set 提供一组三维向量在测试环节中与采样点进行比对;

三、EQS使用:
EQS目前在虚幻4引擎中是还一个测试功能,默认并没有开启。我们如需使用的话需提前手动开启引擎EQS功能。具体方法如下:
Edit – Editor Preferences – General – Experimental – AI – Environment Querying System

开启好后,就可以使用EQS了,具体使用步骤根据前文整理如下:

创建AIPawn、AIController及AI行为树;
创建EQS资产(Environment Query);
在EQS资产中添加采样生成器Generators用于收集采样点;
根据需求向Generators中添加测试规则及EnvQueryContext;
行为树中添加EQS查询节点;
EQS查询节点设置对应的EQS资产及结果黑板变量;
AI行为树根据EQS结果黑板变量进行决策。

四、显示EQS环境信息:
UE4的GameplayDebugger可在编辑器模式下实时显示特定游戏数据,我们可以通过它来查看AI在使用EQS时环境查询的实时信息,包括EQS受击到了哪些采样点,以及每个采样点通过Tests的最终打分结果,十分直观方便。
可以在Edit – Project Setting – Engine – Gameplay Debugger 进行相关设置。
当项目运行时,把准星对准AI,再按撇号键(回车键左边那位),就可以打开Debugger(再按关闭),可以实时显示某个AI当前的EQS环境信息以及一些运行时状态和行为树执行流。

后续我会继续深入研究EQS系统,并对相关引擎源码进行分析,本文会持续更新。
————————————————
版权声明:本文为CSDN博主「RapdoZoro」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gzy252050968/article/details/104905275/