このページでは、Environmental Query System (EQS) アセットの有効化、作成、および編集の一般的なワークフローについて説明します。
EQS の有効化
EQS の使用を開始する前に、[Editor Preferences (エディタの環境設定)] メニューから EQS を有効にする必要があります。
-
[Editor Preferences (エディタの環境設定)] > [Experimental (実験的)] > [AI] セクションで、[Environmental Query System] オプションをオンにします。
EQS クエリの作成
EQS アセットを作成するには、次の手順を実行します。
-
コンテンツ ブラウザ で、[Add New (新規追加)] ボタンをクリックして、[Artificial Intelligence (人工知能)] で、[Environment Query] を選択します。
-
新しい EQS アセットの名前を入力します。
Environment Query の他、コンテンツ ブラウザではカスタムのジェネレータアセットおよび Context ブループリント アセットを作成できます。
EQS クエリの編集
EQS アセット内で、ジェネレータ を使用すると、テストされ重み付けされることになる位置またはアクタを生成します。コンテキスト(基準となる枠組み) を提供し、テスト でジェネレータのどのアイテムが最も良い選択肢であるかを特定できます。次のセクションでは、EQS アセット内でこれらのそれぞれを作成する方法を説明します。
ジェネレータを追加するには、次の手順を実行します。
-
EQS のグラフで右クリックして、希望のタイプのジェネレータを選択します。
ジェネレータを追加したら、Root ノードをドラッグしてジェネレータに接続します。
Root には複数のジェネレータを接続できますが、クエリでは一番左のジェネレータのみが使用されます。
テストを追加するには、次の手順を実行します。
-
ジェネレータを右クリックして、追加するテストを選択します。
テストを追加すると、ジェネレータに接続されているように表示されます。テストを選択して、[Details (詳細)] パネルでプロパティを調整します。
コンテキストを定義するには、次の手順を実行します。
-
テストの [Details (詳細)] パネルで、 EnvQueryContext を希望のコンテキストに変更します。
プロパティ名は、テストのタイプに基づいて変わります。詳細については、「テスト」を参照してください。
EQS Query のプレビュー
エディタで EQS クエリの結果をプレビューできます。ウェイト付け/フィルタリングされた結果がデバッグ球体で表されます。

この画像では、レベルのプレイヤー キャラクターが見える位置を返す EQS クエリをデバッグしています。
詳細については、「AI デバッグ」または「EQS Testing Pawn」を参照してください。
Behavior Tree で EQS を使用する
EQS Query を作成したら、Behavior Tree 内で タスク の一部としてクエリを実行できます。
-
Behavior Tree 内で右クリックして、Run EQS Query Task ノードを追加します。
-
[Run EQS Query] で、実行する [Query Template (クエリ テンプレート)] (目的の EQS アセット) とこのクエリで返される [Blackboard Key (ブラックボード キー)] を割り当てます。
返されるブラックボード キーが最も高いウェイトの結果 (オブジェクトまたはベクター) になります。この例の EQS クエリでは、プレイヤーの場所を特定し、その場所を MoveToLocation という名前のブラックボード キーに提供します。
必要に応じて、[Query Config (クエリ設定)] オプションを使用して、EQS アセットに渡すパラメータを追加できます。
ネイティブ コードで EQS を使用する
EQS Queries は通常 Behavior Tree 内で実行しますが、ネイティブ コードから直接使用することも可能です。以下のの例は、特定のゾーンでスポーンするためにキャラクターまたはアイテムの安全な場所を探す仮想クエリを示しています。
// これらの名前は、クエリで使用される変数名と一致する必要があります
static const FName SafeZoneIndexName = FName(TEXT("SafeZoneIndex"));
static const FName SafeZoneRadiusName = FName(TEXT("SafeZoneRadius"));
// ゾーンのインデックスと安全半径に基づいて、安全なスポーンポイントを見つけるためのクエリを実行します
bool AMyActor::RunPlacementQuery(const UEnvQuery* PlacementQuery)
{
if (PlacementQuery)
{
// クエリ リクエストをセットアップします
FEnvQueryRequest QueryRequest(PlacementQuery, this);
// クエリ パラメータを設定します
QueryRequest.SetIntParam(SafeZoneIndexName, SafeZoneIndexValue);
QueryRequest.SetFloatParam(SafeZoneRadiusName, SafeZoneRadius);
// クエリを実行します
QueryRequest.Execute(EEnvQueryRunMode::RandomBest25Pct, this, &AFortAthenaMutator_SpawningPolicyBase::OnEQSSpawnLocationFinished);
// クエリを開始したことを示すために true を返します
return true;
}
// クエリの開始に失敗したことを示すために false を返します
return false;
}