[C++/UE] UE5中AI開發的一點功能梳理(八) – Environment Query System(EQS)及其Generator說明

EQS(Environment Query System)

  • 用途:使AI對周邊環境進行評分,並根據評分獲取到合適移動目標點
  • 創建編輯時可視化EQS: Blueprint class -> EQS Test Pawn

Env Query Context

  • 創建Env Query Context
  • Context可在後面的具體Environment Query藍圖裡使用,用於指定某項具體測試 / 測試網格生成的中心點Actor/ 位置
    • 因此Context裡可以重載4個函數,分別是可以返回單個/多個Actor/位置,需要且只應重載其中一個

Environment Query

  • 創建Environment Query: 資源窗口右鍵 -> Aritificial Intelligence -> Environment Query
    • 在剛剛創建的EQS_Tester身上的Query Template設為該Environment Query
    • 打開Environment Query藍圖,從Root中拖出Generator節點(只能有一個),用於生成測試點(淺藍色小球);然後再添加不同Test節點,用於在所有測試點上跑篩選和評分,最後返回一些位置結果為行為樹/藍圖

Generator說明

Actors Of Class
  • 以Search Center為中心,以Search Radius為半徑搜索Actor Class對象,在這些對象的位置上生成測試點
  • Generate Only Actors in Radius:如果不勾,就會不限Radius從世界中搜索所有為Actor Class的對象
Composite
  • 可在裡面定義一個Generator列表並將他們組合使用,在不同Generator返回的對象/位置上生成測試點
  • 最好不要把返回不同類型的Generator共用,如Actors of class(返回Actor[])和Grid(返回Vector3[]),不然必閃退
    • 雖然有Allow Different Item Types 和 Forced Item Type 的選項可以去控制Generator的返回類型,但是就算沒閃退,看著生成出來的測試點效果也不太對,所以最好還是別這麼用
Current Location
  • 指定Context位置上生成測試點
Perceived Actors
  • 在指定感官(Sense to Use)感知到的符合條件(Allowed Actor Class)的對象的位置上生成測試點
    • Search Radius 在Sense本身的檢測範圍上額外增加的檢測半徑
    • Include Known Actors 是否包括所有被感知過的Actor,還是只包括當前正在感知到的Actor
  • 只能在運行時調試
Points
  • Circle
    • 在指定半徑(Circle Radius)的圓周上生成一定點數的測試點(分布根據點的數量 Number of Points/點的間隔 Space Between來分布)
    • Arc Angle:圓的弧度
      • Arc Direction:方向
  • Cone
    • 在指定的角度(Cone Degrees)和長度(Range)範圍內,生成出一片錐形的分布的測試點
    • Aligned Points Distance:同角度的點之間的距離
    • Angle Step:每條組成錐形的直線節點組的間距
  • Donut
    • 在指定內圓半徑(Inner Radius)和外圓半徑(Outer Radius)之間生成指定數量(Number of Rings)的環,在各環上生成出指定點數(Points Per Ring)的測試點
    • Arc Angle:圓的弧度
      • Arc Direction:方向
    • Use Spiral Pattern:每圈要有一定旋轉
  • Grid
    • 根據指定的網格半尺寸(Grid Half Size)生成測試點矩陣,每個測試點的間距為Space Between
  • Pathing Grid
    • 根據指定的網格半尺寸(Grid Half Size)在指定的導航網格上(Navigation Filter)生成測試點矩陣,每個測試點的間距為Space Between
    • Scan Range Multiplier 搜索範圍,如果為0,則只在當前所在網格上生成
共同參數
  • Generate Around/Center 測試點的生成的原點
  • Trace Data / Projection Data 點生成時,在水平面和垂直面上的導航網格考慮
自定義Generator
  • 創建繼承自EnvQueryGenerator_BlueprintBase的藍圖
    • 藍圖提供兩個虛函數,必須且只應重載其中一個,兩個都會把Generator的Context傳進來,不過具體的類型不一樣
      • DoItemGenerationFromActors:會把Generator的Context Actors傳進來
      • DoItemGeneration:會把Generator的Context Locations傳進來
    • 然後再在藍圖內,根據中心Actor/Location(列表)信息,按照一定的規則計算後,再添加測試點的Actor/Location
      • 添加Actor/Location測試點
  • 共同參數說明
    • Auto Sort Tests 進行Query前會做排序優化
//EnvQueryMananger.cpp
if (SortedTests.Num() && LocalGenerator->bAutoSortTests)
{
    LocalOption->Tests.StableSort(EnvQueryTestSort::FAllMatching());
    if (bOptionSingleResultSearch && MostExpensiveFilter)
    {
        // the only difference between running for a single result is that 
        // we want to perform a single most expensive test as the last test
        // to accept the first one that passes the test.
        // so here we're adding that final, most expensive test
        LocalOption->Tests.Add(MostExpensiveFilter);
    }
}