1. EQS基础
1.1 生成器节点
生成器:在需要生成的地方生成一系列的范围的测试点,用于加权和测试。
1.1.1 Actors of Class
用于查找范围内的Actor类,不受地形、视角等的影响,只要在范围类的Actor都会被找到。
1.1.2 Points:Grid
用于生成网格,有大小和间距参数,同时需要指定生成在那个物体周围。
1.2 情景
EnvQueryContext_Item(项目)是Test Pawn中看到的小球,就是生成器生成的点。
EnvQueryContext_Querier(查询器)是被AI控制器占据的Pawn,执行启动场景查询的行为树。
在Actors of Class中搜索中心使用EnvQueryContext_Item则搜索不到玩家,搜索中心使用EnvQueryContext_Quener则在一定范围内能搜索到玩家。
自定义情景:使用EnvQueryContext_BlueprintBase(EQC)作为环境查询情景,在蓝图中,通过重载函数进行目标的返回。
1.3 测试
在EQS中,测试用来确定生成器所产生的项目哪个是最佳的选择。
1.3.1 Distance测试
注意:
(1)在相对的标准化下,最小的为0,最大为1。
(2)常量在绝对的标准化下所有都是1;在相对的标准化下最近的为0。
(3)反转线性就是线性反过来。
(4)得分因素通常情况下可认为就是个乘法因子。
(5)因为得分是0-1的,平方后得分会更倾向于0,平方根后得分会更倾向于1。
1.3.2 Dot测试(点乘测试、方向测试)
注意:
(1)两种模式,一种为Rotation,即直接是矢量方向,另一种为两点,首点到尾点的矢量方向。
(2)使用两向量的点乘就是去计算两向量方向夹角的得分,如下图所示,朝前的方向得分为1,朝后的方向得分为0。
1.3.3 Trace测试
布尔匹配为true,即匹配true的值,把true的值设置为Trace,过滤掉。如下图所示。
1.3.4 Overlay测试
1.3.5 Project投射测试
Project投射测试主要用于修正测试点的位置,如在不平整的地面上生成。
在Grid中有Projection Data的属性可用于修正生成点的位置,这与Project投射测试的作用一致。
而添加Project投射测试可以根据修改Projection Data的属性进行过滤和得分。
2. EQS的简单应用
2.1 NPC寻找玩家
在项目设置中勾选EQS选项。
(1)新建Player Charater类EQS_NPC、AIController类EQS_AI,黑板EQS_BB,行为树EQS_BT,场景查询蓝图类EQ_FindPlayer。
新建EnvQueryContext_BlueprintBase蓝图类,命名为EQC_PlayerContext。
(2)在EQC_PlayerContext蓝图中重载Provide Single Actor函数,作用为在EQS中添加玩家对象的返回值。
(3)在EQ_FindPlayer蓝图类中,引出Point:Grid节点,改为1000的半径和150的间隔。
添加仅过滤测试Trace。
添加仅得分测试Distance,并设置积分因子为-1。
(4)在黑板中添加关键帧,布尔类型的IsFindObject,矢量类型的ObjectPosition,对象类型的ObjectActor,注意:ObjectActor的Base Class为Actor。
(5)编写随机移动的BTTask
(6)在NPC_AI蓝图中添加AIPerception组件,并添加AI Sight config。
针对AIPerception添加目标感知时更新。
在目标感知时更新存储Actor并判断是否为Player。
当没有发现目标时,设置5秒的计时器,并设置没有找到目标,5秒后丢失目标。当感知发现后进入Fight逻辑。
(7)编写对应的行为树逻辑
行为树执行过程逻辑如下:首先AI巡逻,如果看到玩家,会触发视觉感知更新,AI将一直看着玩家;当玩家在AI视觉中消失,会触发视觉感知更新,将Is Find Object置为false,同时运行EQS,根据玩家由近到远的得分选取移动位置,直到视觉中看到玩家,触发新一轮的视觉感知更新,并设置5s的Set Timer by Event,即5s后丢失目标。
最终效果:AI看到玩家后,面对玩家,若玩家躲避,AI会移动到一个新的位置(EQS查询的结果)并继续看着玩家。
2.2 躲藏玩家
添加仅过滤的测试Trace。
添加仅得分的测试Distance。
再添加仅得分的测试Distance。
注意:EnvQueryContext_Querier是在AI角色的周围搜索,即返回的是AI控制器控制的Pawn。
此处的作用即是距离角色最远,而距离AI本身最近的点。