• 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左边)就可以看到了,进行调试。

  • 相关阅读:
    LeetCode 1122. Relative Sort Array (数组的相对排序)
    LeetCode 46. Permutations (全排列)
    LeetCode 47. Permutations II (全排列 II)
    LeetCode 77. Combinations (组合)
    LeetCode 1005. Maximize Sum Of Array After K Negations (K 次取反后最大化的数组和)
    LeetCode 922. Sort Array By Parity II (按奇偶排序数组 II)
    LeetCode 1219. Path with Maximum Gold (黄金矿工)
    LeetCode 1029. Two City Scheduling (两地调度)
    LeetCode 392. Is Subsequence (判断子序列)
    写程序判断系统是大端序还是小端序
  • 原文地址:https://www.cnblogs.com/wbx-Blog/p/7147666.html
Copyright © 2020-2023  润新知