UnrealEngineにはEQS(Environment Query System)という周囲の環境を測定して賢く敵Aiなどが動くように指示するための、座標計算などができる仕組みが備わっています。
今回はEQSを設定する部分の備忘とこれから自分が理想とするAiにはどのようにEQSを設定する必要があるかを考えて行きます。
ここにYouTube動画を作れていたら貼り付ける予定。
ビヘイビアーツリー、EQSの基本的な階層構造
レベル上に配置したEnemyキャラクターがAIコントローラーを持ち、Aiコントローラーからビヘイビアーツリーを呼び出す形でAiの基本動作を作ります。さらにAiに周囲の環境状態を教えるためにUnrealEngineにはEQSという仕組みがあり条件を設定することで、場所ごとにスコアを与えることで、指定した条件(例・プレイヤーから隠れられる場所)に一致した場所を教えることができます。
Aiの基本的な作り方(11個の要素解説+使い方)を改めてまとめ直した記事を書きました。合わせて見てね。https://essence-of-human-game-creation.com/unrealengineai-ai-basic-operation/
Aiの作り方
- キャラクターの敵などAiで動かしたいActorを用意する
- コンテントドローワー → 右クリック → ブループリントクラス → すべてのクラス → 検索で AiControllerを選択して作成
- 敵のブループリントのAiControllerクラスに作成したコントローラーを設定
- コンテントドローワー → 右クリック → Ai → ビヘイビアーツリーを作成
- AiControllerのEventBeginPlayから RunBehaviorTree で作成したビヘイビアーを起動する。
- 作成したビヘイビアーに処理を書いていく。
- ブラックボードに値を入れるにはAiControllerのEventBeginPlayから、「SetValueAsObject」ノードを使用して値を入れることができる。
GetBlackBoardでビヘイビアーにアタッチしたブラックボードを取得
Make Literal Nameでブラックボードの変数名を入力
ブラックボードに入れたいものを格納する
Vector変数をブラックボードに入れるには?
- ビヘイビアーツリーに対応させたブラックボードにVector変数を作る
- AiControllerにVector変数を作成。
- レベルに配置したオブジェクトなどの座標をコピー
- AiControllerのVector変数の初期値にペーストで座標を入力
- 変数をGetして「SetValueAsVector」ノードを使用して値を入れることができる
タスクの作り方?
- ビヘイビアーエディター上部の新規タスク → BTTask_BulePrintBaseを継承してタスクを作成 → フォルダの保存場所が選べる
- 関数 → オーバーライド → Event Receive Execute Ai → 処理を追加 → 最後にFinish Executeノードを繋がないと次のタスクや処理に進まない。
具体的なアタッチ場所(ビヘイビアーツリー)
今回の結果
今回はPlayerの目線から障害物で隠れた地点にスコアを与え、障害物で隠れている場所の近い部分に移動してもらうような条件を与えてEQSを作成しました。
一応プレイヤーに対して障害物に隠れるような動きをしてくれましたが、プレイヤーが障害物の近くまで移動しないと敵が動き始めてくれない、という変な動きをするようなAiとなりました。
理想の動き、EQSの実装
理想としては敵がプレイヤーを発見したら、近くの障害物に隠れるような動きをして欲しかったのですが、まさかのプレイヤーが障害物に近づかないと敵が障害物に隠れない、という妙な動きになってしまいました。
つまりプレイヤーから障害物が見える地点に移動しないと障害物の影になる地点を計算してくれないということになります。常にプレイヤーから障害物に隠れる場所を計算しつつ、敵がプレイヤーを発見したらすぐに障害物影に隠れるような動きをEQSやビヘイビアーを使って実装しなければなりません。
トレースをPlayer中心から放出
今回の設定ではレベルに配置したEQSのスパウンからトレースした障害物で隠れるスコアを参照して敵が移動していましたが、理想の動きにするには、プレイヤーからトレースを放出して障害物の影になる場所を取得する必要がありそうです。 → すでにBPEQC_HideFromPlayerを設定している時点でプレイヤーからのトレースになっていました。(エディターでの反映がされてなかっただけ。)
もしくは、敵がプレイヤーを見つけたとき、または、敵とプレイヤーの距離が近いときに逃げる動きを新しく作成する必要があるかもしれません。
敵とプレイヤーの距離を測るにはカスタムサービスの作成が必要
敵とプレイヤーの距離を測るにはカスタムサービスを作成して自前で距離を測る処理を作る必要があることが判明しましたカスタムサービスを作るところまではできましたが、実際にサービス動かすところは今日はできませんでした。ということで次回の課題にして、続きはこの記事の以降にまた記載して行こうと思います。
コメント