UnrealEngineでAiを作成するときに使用する11個の要素について簡単な意味と、実際に使うときの手順をまとめました。
Aiの用語説明 → Ai作成の基本操作
Actor(プレイヤー、敵など) Aiで動かしたい対象です
AiController 敵などのActorにアタッチして敵を制御するためのコントローラー
BehaviorTree AiControllerから呼び出されるAiの挙動を示したツリー
BlackBoard BehaviorTreeで使用する変数を格納する場所
Task Behaviorで実行される処理
デコレータ Aiのフローに条件を設定してAiの流れを設定する
サービス 下のノードが実行されている間定期的に更新される処理
EQS Testing Pawn レベルに配置するEQSを呼び出して環境を測定する基準場所
EQS(説明1) 周囲の物体の環境を測定して環境に対する位置にポイントを生成
EQS(説明2) そのポイントにプレイヤーを動かすなど動作の座標を取得する
ジェネレーター 環境を測定するためのポイントを生成する人
テスト 生成されたポイントに優先度をつけるコマンド
クエリコンテクスト EQS Testing Pawnをどこから発生させるかを指定できる
Actor AiController BehaviorTreeなどの全体像
Actor(プレイヤー、敵など)
- コンテントドローワー → 右クリック → ブループリント → よく使う項目ボタンのActorを選択(一番上のボタン)
- キャラクターのモデルやコリジョンのコンポーネントなどを追加していきますが詳しくは割愛。
AiController
- コンテントドローワー → 右クリック → ブループリントクラス → すべてのクラス → 検索で AiControllerを選択して作成
- ファイルをダブルクリック → イベントグラフに実行させたいビヘイビアーツリーをEvent BeginPlayなどから「 RunBehaviorTree 」ノードを使用して呼び出す。
BehaviorTree
- コンテントドローワー → 右クリック → Ai → ビヘイビアーツリー → 名前をつけてファイルを作成
- 作成したファイルをダブルクリック → ビヘイビアーツリー編集ウインドウが開く
- ルートから自分の作りたい理想のAiを作成していく
BehaviorTreeのフロー処理
Behaviorの流れを制御するには大きく3つのコンポジットがあります。
- Selector
- Sequence
- Parallels
詳しくはUnityアセットGameCreator拡張モジュールBehaviorとほぼ同じです。
コンポジットの意味を図解した記事があるので詳しく知りたい人は別記事をご覧ください。
Behaviorの使い方(GameCreator1)↓
https://essence-of-human-game-creation.com/behavior-howtouse/
BlackBoard
- コンテントドローワー → 右クリック → Ai → ブラックボード → ファイルを名前をつける
- ビヘイビアーツリーに対応させたいブラックボードをビヘイビアー編集画面右 → 詳細 → Ai → BehaviorTree → BlackBoardAsset へ作成したブラックボードを設定する
- ビヘイビアーツリー編集ウインドウで、右上のビヘイビアーツリー/ブラックボードで表示を切り替えられる
タスク・サービスからブラックボードの変数の値を変更する方法
- タスクの処理に SetBlackbordValueAs変数の型名 のノードを追加
- ノードにKeyと変数の値を入れる入力ピンがあるはず
- Keyのインプットを引っ張って PromoteToVariable を選択 → 自動的に変数にKeyという名前のブラックボード型の変数が作成される。わかりやすいように変数名をKeyではなくセットしたい変数が分かる名前(例・今回はライフルを装備したかどうかのBool値をセットしたいので 「 Key_BB_isRifleEquip 」などがわかりやすそう。)
- Key変数の目玉をクリックして変数を公開状態にしておく。
- ビヘイビアーツリーに戻って、タスクノードを選択 → 画面右 詳細ウインドウ → デフォルト → Key という項目があるので、そこでブラックボードに格納したい変数を指定する。
EQSからブラックボードの変数の値を変更する方法
- ジェネレーターが勝手にブラックボードへのアクセスを作成?
- ビヘイビアーツリーの編集画面でノードを選択 → 詳細 → ブラックボード → BlackboardKey → プルダウンから変数を選択できる
ブラックボードへのアクセス
敵(ブループリントアクター)からブラックボードの値を変更できない?
Aiで動かしたい敵、のイベントグラフ(敵の基本行動、Aim 発砲 武器装備などが実装されてる)から直接ブラックボードにアクセスはできないことはない様だけど、一般的ではないようです。
今回231019敵が発砲して弾がなくなったらビヘイビアーの動作でリロード処理へ渡す分岐を作るために変数Bool(水がなくなったよ)で処理の流れを変えたかったのですが、そのBool値をブラックボードへ渡すことができずに悩みました。
おそらく基本的な動作を敵イベントグラフにすべて任せるのではなく、極力サービスやタスクにAiで動かしたい処理を書くのがビヘイビアーコントロールの基本なのではないかと推測します。
関数を使えばタスク、サービスに処理を渡し、タスク、サービスからブラックボードの値を変更できた
敵(ブループリントアクター)に関数を作成して、そこで弾数をチェックする機能と、弾数がゼロになったことを示すBool値をアウトプットできるようにしました。その関数をタスクから呼び出して、呼び出した関数のアウトプットからタスクのブラックボードに変数を渡す処理を作ることで、敵が発泡して弾薬がなくなったことをブラックボード変数へ書き込むことができました。
タスク デコレータ サービス
Task
- ビヘイビアーエディター上部の新規タスク → BTTask_BulePrintBaseを継承してタスクを作成 → フォルダの保存場所が選べる
- 作成したタスクをダブルクリック → 関数(画面左の方) → オーバーライド → Event Receive Execute Ai → 処理を追加 → 最後にFinish Executeノードを繋がないと次のタスクや処理に進まない。(Event Receive Execute Aiがビヘイビアーツリーから処理が通ったときに実行される処理になる)
デコレータ
- ビヘイビアーツリー編集グラフの上のバーから新規デコレータ
(既にあるデコレータを使用して新規で作る場合は少ないかも?) - テンプレートとなるデコレータが2個あるのでどちらかを選んで新規作成
- ファイルの保存場所を尋ねられる → 保存
- コンポジットノードを選択 → 右クリック → デコレータを追加
- ファイルをダブルクリックで編集できる → 詳しい作り方はまた調べます。
デコレータの種類と意味
UnrealEngineの公式ドキュメントに詳しく項目の説明が記載されていました。↓
https://docs.unrealengine.com/4.27/ja/InteractiveExperiences/ArtificialIntelligence/BehaviorTrees/BehaviorTreeNodeReference/BehaviorTreeNodeReferenceDecorators/
サービス
- ビヘイビアーツリー編集グラフの上のバーから新規サービス
- サービスにはテンプレートとなるものが最初からないっぽい?のでファイルの保存場所を尋ねられて新規作成。
- ファイルをダブルクリック → イベントグラフが開く → 関数 → オーバーライド → 「 EventReceiveTickAi 」を選択 → イベントノードが出現
- サービスが呼ばれている間毎フレーム動く処理を追加していく。
(例・敵がプレイヤーを追いかけてくる)など - サービスを呼び出したいEQSファイルをダブルクリック → コンポジットノードを選択 → 右クリック → サービスを追加
サービスの種類と意味
サービスもUnrealEngineの公式ドキュメントに詳しく項目の説明が記載されていました。↓
https://docs.unrealengine.com/4.27/ja/InteractiveExperiences/ArtificialIntelligence/BehaviorTrees/BehaviorTreeNodeReference/BehaviorTreeNodeReferenceServices/
EQS Testing Pawn
- コンテントドローワー → 右クリック → ブループリントクラス → 検索ボックスから「EQS Testing Pawn」 → ファイルに名前をつける
- コンテントドローワーからレベルにドラッグアンドドロップで配置
- 詳細 → EQS → QueryTemplate → 作成したEQSを設定
- 作成したEQSのジェネレーターの種類に応じてポイントがレベル上に表示される
EQS Testing Pawnはジェネレーターの生成されたポイントをエディター上で視覚的に確認するものです。レベル上に配置していなくても、敵などに作成したEQSは動作しました。
EQS
- コンテントドローワー → 右クリック → Ai → 環境クエリ → ファイルに名前をつける
- ファイルをダブルクリック → ルートから処理を左クリックで引っ張ってジェネレーターを作成
- ジェネレーター選択 → 右クリック → テストを追加 から → さらにジェネレーターにテストを追加することができる
- ビヘイビアーツリーのコンポジット(Selector、Sequenceなど)から左クリックで引っ張って来て 「 RunEQSQuery 」を選択 → タスクと同じ様にコンポジットからの流れで流れてきたときにEQSを発動できる。
- コンポジット自体にEQSを実行させる方法 → コンポジットを選択 → 右クリック → サービスを追加 → Run EQS
ジェネレーター
EQSから環境を測定するポイントを生成する人です。主に9種類のポイントの生成方法があるようです。
- Actors Of Class 指定した半径からのActorを検索してブラックボードへ値を返す
- Composite 複数のジェネレーターを組み合わせることができる
- Current Location 指定された [Query Context (クエリ コンテキスト)] の位置を取得
- Perceived Actors センスを利用してActorを検索(よく分からなかった)
- Points Circle 指定された Query Contextから円形にポイントを生成、座標を返す
- Points Cone 指定された Query Contextからコーン形状にポイントを生成、座標を返す
- Points Donut 指定された Query Contextからコーン放射状ににポイントを生成、座標を返す
- Point Grid 指定された Query Contextからグリッド状ににポイントを生成、座標を返す
- Point Pathing Grid ナビメッシュ上にポイントを生成(グリッド状)
解読が難しいですがUnrealEngineの公式ドキュメントに説明がありました↓
https://docs.unrealengine.com/5.0/ja/eqs-node-reference-generators-in-unreal-engine/
解読できたら上のリストにわかりやすい説明を付けておきたい。
画像では良く分からなかったと書いていますが、その後調べて、Perceived Actor以外はレベル上にポイントを生成することに成功しました。このポイントに条件を指定したり、テストで評価を与えることで、特定のポイントをブラックボードの変数に格納したりすることができます。
テスト
ジェネレーターで生成したポイントに優先度(点数)をつけるコマンドです。優先度が高いポイントの座標にプレイヤーを移動させるなどの用途があります。
- Distance 距離に応じてポイントに点数を付けます。
- Dot ポイントの正面、後ろ側と前と後ろの向きに応じて点数をつけます。
- Gameplay Tags
- Overlap
- Pathfinding 移動のパスの長さで点数をつけれます。
- Pathfinding Batch コンテクストへのパスがあるか、長さなどで点数をつけれる?
- Project アイテムが床の上にあるかで点数をつける?
- Trace ポイントから指定した物が見えるかどうかで点数をつけます。
- Volume
テストも同じ様にUnrealEngine公式ドキュメントにありました。↓
https://docs.unrealengine.com/5.0/ja/eqs-node-reference-tests-in-unreal-engine/
解読できたら上のリストにわかりやすい説明を付けておきたい。
クエリコンテクスト
EQSがどこから環境を測定するかをしていするかを設定できる人です。
(例・プレイヤーからの距離・敵からの距離・特定のアクターの位置からの距離など)
- コンテントドローワー → 右クリック → ブループリントクラス → 検索ボックスから「 EnvQueryContext_BluePrintBase 」を選択 → ファイルに名前をつける
- ファイルをダブルクリック → イベントグラフ編集画面 左側から 関数オーバーライド 「 Provide Single Actor 」を選択
- Provide Single ActorとReturn Nodeの間に挟まっているGetActorOfClassのActorClassを指定することで、特定のアクターを取得することができ、EQSのポーンがどこから発生するのかを設定することができる。
- EQSファイルをダブルクリック → EQSに追加したジェネレーターを選択 → 詳細 → Trace from Context → Contextへ作成したクエリコンテクストファイルを設定
- レベルビューのEQSPawnから作成されたポイントが指定したクエリコンテクストで取得したアクターの一から発生しているかを確認
EQSはタスクとしてもサービスとしても実行できる
タスクとして実行
ビヘイビアーツリーのコンポジット(Selector、Sequenceなど)から左クリックで引っ張って来て 「 RunEQSQuery 」を選択 → タスクと同じ様にコンポジットからの流れで流れてきたときにEQSを発動できる。
サービスとして実行
コンポジット自体にEQSを実行させる方法 → コンポジットを選択 → 右クリック → サービスを追加 → Run EQS
上記の手順でEQSはタスクとしてもサービスとしても実行できます。となると、違いは何なの?となりますが、EQSが呼ばれる頻度が違います。下の図。サービスで指定するとなにかの行動(今回は移動)しながらEQSを定期的に呼び出すことができ、実用上で言えば、移動(タスク)しながら敵の位置を検出(サービス)して銃を発砲する(サービス)、などといった使われ方をされます。
コメント