UE4场景询问系统浅析(EQS与行为树)

前言

EQS,全称Environment Query System,翻译过来是环境询问系统。官方给出的解释是,虚幻4中提供给人工智能(AI),用于收集环境数据,进行测试分析,寻找到最符合测试的结果。

其实,我们简单的解释,EQS主要用来帮助AI进行场景位置信息的筛选,所有的筛选均按照给定的条件进行打分(分高最佳)或是剔除,最后提供一个最贴合查询的结果,供给AI来使用。一般可以用来去寻找躲避点,或是寻找最优攻击位置等。

目前在4.19中,此功能依旧是测试功能,需要在测试项中进行开启。如果你想要使用EQS先要按照下面的步骤进行开启。

Edit–Editor Preferences–Experimental–AI中勾选“Environment Querying System”

开启成功后,可在内容浏览器中右键AI中看到EQS资产创建选项,参照图一。

图一

操作步骤

由于EQS提供给行为树使用,我们会配合寻路网格(EQS可以不依赖寻路网格进行工作),帮助行为树为黑板提供一个空间位置。操作步骤

  1. 构建行为树
  2. 内容浏览器中构建EQS资产(Environment Query)
  3. 选择询问点采样生成器,用于在角色附近计算采样点
  4. 编写测试
  5. 行为树中加入EQS进行坐标点搜寻
  6. 移动到搜寻目标点

 

名词解释

位置采样生成器(Generators)

主要是用于采样生成规则,以某一种规则在使用者四周进行参考点选取,将选取的位置点用于测试。

测试规则(Test)

将采样点,用于规则检测。根据点与参照内容(一般参照内容有询问者,或是采样点自己,也可以编写参照内容)之间使用的规则,为采样点进行打分或是踢除。

测试目的有三种

  1. Score Only  仅打分,根据规则为采样点打分,用于最后进行信息提供做参考。打分属于最单纯的测试目的,不会导致采样点被排除
  2. Filter Only  仅筛选,使用规则对采样点进行踢除,用于缩小测试范围,将符合筛选条件的内容进行保留,其他进行踢除
  3. Filter and Score   筛选并打分,综合上两种操作

注意:筛选会使得检查点数量越来越少,有助于提高查询效率。对于筛选的使用,切记筛选点选择合理,由于采样点将会越来越少,可能会导致无法找到合理位置。

测试内容(EnvQueryContext)

Context在测试项中扮演着非常重要的角色。在测试节点中,我们针对不同的测试方式需要选取不同的参照物进行测试参与。例如距离测试,我们需将采样点和Context进行距离计算(默认提供了询问者和采样点Item,参照图二)。简单说,就是拿采样到的每一个点,分别和Context进行测试比较,然后将结果以分数形式标记于采样点。

图三

我们也可以自定义参照内容,需要构建蓝图对象,并继承EnvQueryContext(在内容浏览器中创建Blueprint Class,选择继承类为EnvQueryContext)。

双击创建的询问内容,在函数中我们可以根据设计需求进行重载,参照图四。

图四
  • Provide Single Location 提供一个点作为测试询问内容
  • Provide Single Actor 提供一个对象作为测试询问内容(一般我们会使用此函数来返回场景中的主玩家,AI主要是和玩家较量,所以EQS中玩家比较是必不可少的)
  • Provide Locations Set 提供一组位置信息作为测试询问内容
  • Provide Actors Set 提供一组对象信息作为测试询问内容

生成器描述

图五(4.19中的生成器)
  • Actors Of Class 选点方式通过采样场景中的对象,类型匹配正确,则使用对象位置信息作为采样点(可以设置半径范围,和采样中心参照)
  • Composite 复合多种生成器,用来组合生成器使用
  • Current Location 使用当前位置作为采样点。当前位置可以使用Context进行选取,或是询问者自己,或是Context中返回的内容
  • Points Circle 环形生成器。选取方式使用参考点(一般是询问者,或是Context提供的数据)向四周转圈发射射线。如果触碰到任何物体则将碰撞位置作为采样点,如无碰撞则以设定最大半径为采样点。可以设定半径和发射间隔角度
  • Points Cone 锥形生成器
  • Points Donut  环状生成器,区别于Circle,此生成器如同水波,一层一层向外扩散,直到最大半径
  • Points Grid  简单的格子生成器,不对采样点进行路径规则校验,不可达位置也将被收集。收集方式:以参照位置(一般是询问者)为基准,垂直向上向下进行导航投射,如有导航覆盖,则返回采样点。
  • Points Pathing Grid 格子生成器,采样点必须是导航可达,需要满足导航规则校验。收集方式:以参照位置(一般是询问者)为基准,垂直向上向下进行导航投射,如有导航覆盖并且参照位置可达,则返回采样点。

 

测试描述

图六 测试节点

测试构建时,所有测试项越靠上,则越优先测试,测试关系是从上至下逐层筛选,上层过滤掉的采样点,下层将见不到,总体呈现查询内容越来越精简的结果。

 

官方对测试节点有文章介绍,我不赘述参数描述,简单说下测试节点的特点和用途。您可以直接参照官方说明(传送门

  • Distance 距离测试节点,将选择器选取的点用给予和参照内容进行距离测试。距离越远则分值越大,如果希望越近分值越大请调整Score中的Scoring Equation,将线性递增改为递减(Inverse Linear)
  • Dot  使用点乘的方式,为选取点打分,值域范围0-1(点乘有负数,打分无负数,正面为1,背面为0,呈现扇形左右递增向1)。也可以对结果进行绝对值设定(勾选Absolute Value,结果为点乘后绝对值值域0-1,正面1,背面1,左右两边0)。点乘中的向量选取可以使用两点方式或是Rotation方式。
  • Gameplay Tags 使用标签进行询问测试(GamePlay Tags本身是为Actor查询操作提供分层,一般用于查询。关于GT使用,我后期会出一篇文章介绍)
  • Overlap  在采样点,使用通道检测方式,返回是否有符合通道标记的内容存在。如存在返回1,反之返回0。检测形状,Box,Sphere,Capsule。用于检测查询某一个点附近是否存在某一样东西。
  • Pathfinding  将采样点与内容进行导航寻路器测试,可达则分数1,不可达为0。它将用于最终测试点生成,返回一个可达测试点。
  • Pathfinding Batch 将采样点与内容进行导航寻路器测试,可达则分数1,不可达为0。它会返回所有可达点,供下个测试项目使用。
  • Project  投射测试。可以用来修正生成器采样点位置。两种模式:导航投射,在采样点为基准,垂直向上向下进行导航检测,碰到导航覆盖点则修正采样点位置。形状检测,不考虑导航,只要在通道碰撞成立,则修正采样点到新的位置。
  • Trace  射线测试。用来测试采样点,到Context参照点之间是否存在遮挡,这是重要节点,一般可以用来寻找可以用来躲避的采样点(从采样点到敌人之间存在遮挡则认定可以躲避)。存在遮挡分数为1,不存在为0。注意:需要考虑高度问题,采样点一般均在地面,从地面直接发射射线到Context可能会出现被非常矮的物体阻挡,可以通过调整Height Offset解决此问题。

 

结语

EQS总体来说内容少,但是理解不容易,需要动手进行测试,才能明白每个节点功能。相对来说想要用好EQS,还是需要费一费脑筋的。下篇文章讲一下如何使用EQS解决实际问题。

 

UE 版本 4.19.3

 

 

 

1 条评论

添加评论

您的邮箱地址不会被公开。 必填项已用 * 标注