UE5の敵の移動方法
UE5で敵をどう移動させたらいいのかわからないという人も多いはず。
そこで今回はナビメッシュを使ってAIの敵をランダム移動させる方法を紹介していく。
敵の移動方法目次
ナビメッシュバウンズボリュームを設定AIControllerを作成
ビヘイビアツリーとブラックボード
キャラ用意
タスクを記述
ビヘイビアツリーを記述
目次にもどる
ナビメッシュバウンズボリュームを設定
NavMeshを使ってAIの敵を移動させるには、まずナビメッシュバウンズボリュームを設定して、敵が動ける範囲を決める必要がある。
以下のマークを選択し、「ボリューム」→「ナビメッシュバウンズボリューム」のように選択しよう。
.jpg)
するとビューポートに以下のようなオレンジの線で囲まれた立方体が表示される。
.jpg)
これをステージの中央付近まで移動させよう。
.jpg)
ナビメッシュバウンズボリュームの詳細ビューの「ブラシセッティング」を確認しよう。
.jpg)
ここでオレンジの線で囲まれた立方体の大きさを変更可能。以下のようにステージを覆う程度にサイズを調整しよう(Third Person Mapのプロジェクトの最初からあるステージであればだいたいX:4000、Y:4000、Z:500程度にすれば、ちょうどよく覆うことができる。)。
.jpg)
ビューポートを選択した状態でPキーを押すと以下のように表示が以下のように切り替わる。
.jpg)
緑色でAIの敵が移動できる範囲が表示される。もう一度Pキーを押せば通常の表示に戻る。
これで、ナビメッシュバウンズボリュームによる敵が動ける範囲の設定は完成だ。
目次にもどるAIControllerを作成
敵の作成を行っていく。
まずはコンテンツブラウザの任意の場所で右クリック→「ブループリント」を選択しよう。
.jpg)
出た画面ですべてのクラスを選択すると、以下のように下に表示される。
.jpg)
ここでAIと検索すれば、「AIController」が出るので選んで、選択ボタンを押す。
今回はできたファイルについてBP_EnemyControllerと名前をつけた。
目次にもどるビヘイビアツリーとブラックボード
コンテンツブラウザの任意の場所で右クリック→「AI」→「ビヘイビアツリー」のように選択する。
.jpg)
作成されたビヘイビアツリーをBT_Enemyと名付けた。
同じくコンテンツブラウザで右クリック→「AI」→「ブラックボード」のように選択。
.jpg)
作成されたブラックボードをBB_Enemyという名前にした。
続いてBP_EnemyControllerを開き、イベントグラフタブを選択する。
.jpg)
以下のように、Event BeginPlayからワイヤーを伸ばし、「Run Behavior Tree」のノードを検索して作成する。
.jpg)
入力のBTAssetで「BT_Enemy」を指定する。横の虫めがねマークから「BT_Enemy」に飛べるので開く。
BT_Enemyを開くと以下の画面となるので、右側の詳細ビューのBehaviorTreeの項目を「BB_Enemy」にする(既にそうなっているかもしれない)。
.jpg)
これでビヘイビアツリーとブラックボードの紐づけが完了した。
目次にもどるキャラ用意
AI用のキャラを用意する。
今回は説明のため、以下のEpic Games提供の無料アセットを使って説明していく。
Paragon: Kallari以上のアセットをプロジェクトに追加後、コンテンツブラウザのParagonKallari→Characters→Heroes→KallariにあるKallariPlayerCharacterのファイルをコピーし、貼り付けて複製する。そのファイルをBP_Enemyと名付ける。
BP_Enemy、BP_EnemyController、BT_Enemy、BB_Enemyと必要なファイルが多いので「Enemy」などフォルダを作り、まとめておくのがおすすめ。
BP_Enemyを開きノードを全て削除する。
.jpg)
ここの処理はボタンを押した時の処理で操作キャラ用であり、今回は敵として利用するので必要ない。
操作キャラではないのでカメラも必要ない。コンポーネントビューをみて、カメラを全て削除しよう。
.jpg)
続いてコンポーネントビューの一番上のBP_Enemyを選択する。
.jpg)
この状態で右側の詳細ビューのポーンの項目(かなり下のほうにある)を確認する。
.jpg)
ポーンのAI Controller Classについて、先ほど作成した「BP_EnemyController」を検索して選択する。
これで、BP_EnemyとBP_EnemyControllerの紐づけが完了した。
BP_EnemyはコンテンツブラウザのParagonKallari→Characters→Heroes→KallariにあるKallari_AnimBlueprintのアニメーションブループリントを使用している。このファイルを開く。
問題になるのはキーを押した時の処理が行われている部分だ。先述したようにBP_Enemyは敵であり操作しない。例えば操作キャラのアニメーションブループリントであれば、移動のWASDキーが押されているかが再生するアニメーションの判断材料などになっていることも多い。Kallari_AnimBlueprintも元々は操作キャラ用に作られているが、これを敵用に変更する必要がある(そうしないと移動時に走るアニメーションが出ない)。
Kallari_AnimBlueprintの場合は変更箇所は2か所。
AnimGraph→Ground Locomotion→idleからJogStart(ルール)の、is AcceleratingからANDに伸びるワイヤーを外す。
.jpg)
AnimGraph→Ground Locomotion→RunからJogStop(ルール)の、is AcceleratingからNOTに伸びるワイヤーを外す。NOTからResultに伸びるワイヤーも外す。
.jpg)
今回のKallari_AnimBlueprintに関しては以下のような変更でOKだが、当然アニメーションブループリントによって構造が異なり、行うべき変更も異なる。だが、押されたキー入力を受け取る「Get Current Acceleration」があったら、そのノードが処理に関わらないようにワイヤーを外せばOKであることが多い。あるいは今回のようにIs AcceleratingのようなAccelerationと似た変数があった場合もそれでキー入力を判断している可能性が高く、そのノードが処理に関わらないようにワイヤーを外せばOKである場合が多い。
目次にもどるタスクを記述
ビヘイビアツリーのBT_Enemyを開き、「新規タスク」を選択する。
.jpg)
BTTask_Randomと名付け保存する。すると以下のようにBTTask_Randomのイベントグラフが開いた状態になる。
.jpg)
左側の関数の項目のオーバーライドと書いている部分を選択すると以下のような選択肢が出る。
.jpg)
Receive Execute AIを選択する。
以下のようにReceive Execute AIのControlled Pawnからワイヤーを伸ばし、Get Actor Locationを検索して配置する。これで敵キャラの位置がわかる。
.jpg)
Get Actor LocationのReturn Valueからワイヤーを伸ばし、GetRundomReachablePointInRadiusのノードを検索して出し、以下のように配置する。Radiusの値を1000(1単位は1㎝)にする。Originの位置(つまり敵の位置)から1000cm(10m)以内のランダムな位置を取得することができる。
.jpg)
GetRundomReachablePointInRadiusのRandom Locationからワイヤーをだし、Set BlackBoard Value as Vectorを検索して出す。以下のようにReceive Execute AIからもワイヤーを伸ばしてつなぐ。更にKeyからワイヤーを伸ばし、Promote to variableを選択する。
.jpg)
画面左側に変数としてKeyが追加されているのが確認できる。以下のようにTargetLocationに名前を変更し、その右側のマークを選択することで目玉マークを出す。
.jpg)
TargetLocationにランダムな位置を代入できる。
Set BlackBoard Value as Vectorからワイヤーを伸ばし、Finish Executeを選択する。GetRundomReachablePointInRadiusのReturn Valueからワイヤーを伸ばし、Finish ExecuteのSuccessにつなげる。
.jpg)
タスクは最後にFinish Executeがないといけない決まりになっている。GetRundomReachablePointInRadiusのReturn Valueで位置取得できたことを確認して、それをSuccessに入力している。
最終的に以下のようになればタスクは完成である。コンパイルしよう。
.jpg)
ビヘイビアツリーを記述
ビヘイビアツリーの画面に戻る。RootからワイヤーをだしSeqenceを出す。
.jpg)
Seqenceからワイヤーを出しタスクの項目にある先ほど作ったBTTask_Randomを選択して出す。
.jpg)
同じようにワイヤーを出し、Move toを出す。
.jpg)
画面右上のブラックボードを選択すると画面をBB_Enemyに切り替えることができる。
新規キーを選択し、Vectorを検索して選択する。Vectorkeyを作成することができる。名前をTargetLocationにする。

画面右上のビヘイビアツリーを選択することで、BT_Enemyの画面に戻れる。BTTask_Randomを選択し、右の詳細画面のデフォルトのTarget Location Keyの項目をTargetLocationにする。
.jpg)
Move toを選択し、右の詳細画面のブラックボードのBlackboard KeyをTargetLocationにする。
.jpg)
最終的に以下のようになる。Seqenceは左から順番に処理を行うので、最初にBTTask_Randomで敵の位置の周囲1000からランダムな位置を取得し、Move toでその位置に敵キャラを移動させる処理ができる。
.jpg)
ゲーム起動時、たぶんコンパイルエラーが以下のように出る。だが、操作キャラ用のブループリントであるKallariPlayerCharacterのエラーであり、使わないので問題はない。プレイインエディタを選択しそのままゲームを起動しよう。
.jpg)
敵キャラがランダム移動を行うのが確認できる。