[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傳進來
- 藍圖提供兩個虛函數,必須且只應重載其中一個,兩個都會把Generator的Context傳進來,不過具體的類型不一樣

-
- 然後再在藍圖內,根據中心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);
}
}