首页 > 代码库 > EQS(场景查询系统)
EQS(场景查询系统)
首先要在Editor Preferences中设置EQS开关,在General中的Experimental(实验)中的AI中勾选EQS。
这样就可以在AI中创建Environment Querying了。创建了之后进行编辑,如何实现呢,其实跟Task差不多,直接在行为树中进行实现就OK了。下面就说如何去在EQS中写。
写东西要明白要达到什么效果,如何达到。这里想达到的效果是躲猫猫,当看到Player时,就跑到一个看不到他的位置,那么就要EQS要做的是找到这个位置,首先要控制范围,在一定范围里寻找合适的点,创建一个Generator->Point当然在什么区域中寻找点自己定。区域订好了,现在就要进行条件选择了。在其中添加一些FilterAndScore。来选择这些判定的条件,这里说思路,需要哪些判定条件在官方文档中搜索。躲猫猫的寻找点的条件是1.点是不是距离自身最近,是不是距离敌人较远。2.点是不是被敌人看不到,可不可以被自己看到。3.从自身到点的路径是不是存在。4.尽量将点设在角色两旁。就先实现一个这样的小案例,感觉EQS还是很方便的。
1. 用生成器生成一个获取点的范围。创建一个Grid。
介绍一下生成器上的编辑数据,GridHalfSize(一半的大小)SpaceBetween(两个Item之间的距离)(获取点,将会把Location存成一个Item,这里指两个点之间的间隔)GenerateAround围绕着什么生成(生成网格的Context)。TraceMode追踪模式(在什么范围内追踪,一般都在导航区域内,Navigation。)
2. 添加Test,首先测试距离,添加一个Distance,介绍一下面板,TestPurpose测试的目的是过滤还是分数,还是两者都有。Distance->TestMode 测试的模式,3D.2D.Z,根据需求自定,DistanceTo(到哪的距离),FilterType(过滤方式)->Range(一定范围)——Max(最大)——Min(最小),Score->Clamping(限制)
具体如何使用,不清楚。ScoringEquation(分数的方程)->可使用Constant(常量)Linear(线性)Square(平方)InverseLinear(反线性)SquareRoot(平方根),这是对测试权重的算法,很精确。ScoringFactor次测试在所有测试中的权重,可以为负值。
NormalizationType正常化的方式(不知何用),Preview是ScporingEquation的图标。
下面设置参数,使距离Quer的距离近,首先不要过滤,如果过滤的话就只省一个最近的点了,我们要对其进行权重判断,距离近的分高,将所有因素的分数相加取最高的。顾这里要将Purpose设为ScoreOnly.,那DistanceTo的Context就是Querier。这里Context我认为是将一些需要的测试数据存储在其中,进行调用。这里本身就有Querier的Context,这是引擎创建的,而其中的目标则是AIController所控制的Pawn。还需要修改的就是ScoringFactor,因为我想让这个Test占用的权重多一些,就将其改大一点。
3. 那下面就要换做离Player远一些了。与上面不通的就是,目标不同,因为系统中没有Player的Context,我们要自己创建一个基于EnvQueryContext_BlueprintBase的类,在类中可以复写函数有ProvideActor,ProvideLocation。当然也有Single和Array的区分。这里我们这么写,将角色添加进去。
这样更该DistanceTo就OK了,还需要更改的就是ScoreFactor,要的效果是,距离越远分数越多。
4. 接下来就是第二个条件了,判断可不可以被看到,那么我们可以用Test中的Trae来设置,这是射线的检测,被Hit到代表可以被追踪到。
5. 先设定,不能被Player看到,这里就使用过滤了,分数有没有都可。将被Player看到的点都过滤掉。这里在介绍一下Detail面板中的Trace,TraceChannel(追踪通道),设置通道的碰撞,TraceComplex,(对复杂的网格进行追踪)TraceFormContext(将射线从Context发出)Filter->BoolMatch(布尔值)(将看到的点进行过滤)(不勾选的话将没看到的点都过滤)。
6. 设定能被Querier看到的点。
7. 获得的点必须是要可以移动过去的,这里可以添加一个Test->PathFinding.
8. 基本上就可以了。不过要是更加智能还需要添加Dot。
9. Dot的目的是测试角度,LineA和LineB的点积为返回值。向量A*向量B=|A|*|B|*cos角度,所以在加绝对值的情况下返回0是0或180度(也就是前后),返回1的时候就是-90或90度(就是左右)。这样就可以对点进行位于目标的左右还是前后进行分数改变了。
还有一个小知识点就是AIDebug,Show->Developer->AIdebug。Play后点击‘(Enter左边)就可以看到了,进行调试。
EQS(场景查询系统)