最近在研究虚幻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
链接:https://blog.csdn.net/gzy252050968/article/details/104905275