Unreal Engine 5で、ビヘイビアツリー、AI Controllerを使って、目標位置に移動するAIキャラクターを作る方法です。
AIキャラクターはナビメッシュを使って探索した経路を移動します。
ここでは、配置したブロックのアクタを避けてプレイヤーキャラに近づいてくる敵キャラクターを作ります。
敵キャラクターのアニメーションブループリント、スケルタルメッシュはプレイヤーキャラクターのものを流用します。
アセットの関係性
使用するアセットの関係性は、下図のようになっています。(厳密な参照関係とは異なります。)
ナビメッシュの作成
Static Meshのアクタを配置したLandscapeにナビメッシュを作成します。
ナビメッシュバウンズボリュームの配置
ナビメッシュバウンズボリュームをレベル内に配置すると、そのスケールに合わせてナビメッシュが作成されます。
- メニューの「ウィンドウ」をクリック
- 一覧の「アクタを配置」を選択して、「アクタを配置」のウィンドウを開く
- 「アクタを配置」ウィンドウの「ボリューム」をクリック
- 「ナビメッシュバウンズボリューム」をビューポートにドラッグ&ドロップして配置
ナビメッシュバウンズボリュームのスケール調整
ナビメッシュバウンズボリュームのスケールを変更して、ナビメッシュを生成する範囲を調整します。
- ウィジェット、または「詳細」の「トランスフォーム」でスケールを調整
建物の上のような高い位置にナビメッシュを作るには、Z方向のスケールを大きくする必要があります。
また、緑色のナビメッシュは、Pキーで表示の有無を切り替えられます。
覚え書き
ナビメッシュの動的な更新
処理が重くなりますが、ナビメッシュは動的な更新ができます。
メニューの「編集」→「プロジェクト設定」→「ナビゲーションメッシュ」→「Runtime Generation」を「Dynamic」に変更します。
段差の飛び降りを許可
通常は通過できない段差を、指定した位置でのみ通過するようにできます。
「アクタを配置」で、「Nav Link Proxy」を検索して配置→「詳細」の「Direction」で、通過を許可する方向を設定します。
ナビメッシュの設定
ボリュームと同時に自動的にレベルに配置される「Recast Nav Mesh」で色々設定を変えることができます。
「Recast Nav Mesh」を選択して、「詳細」の「ナビメッシュの解像度パラメータ」→「Cell Size」を小さくすると、処理は重くなりますが、細かい通路にもメッシュが作られます。
経路の優先度を下げる
他の経路がない場合のみ使用する経路を設定できます。
優先度を下げたい経路に、「アクタを配置」→「ナビモディファイアボリューム」を配置し、「詳細」の「Area Class」を「Obstacle」にします。
ブラックボードの作成
ブラックボードは、ビヘイビアツリーの処理に必要なキー(変数)を一括管理するものです。
このアセットは、ビヘイビアツリーの「Blackboard Asset」に設定して利用します。
アセットの作成
- 「コンテンツブラウザ」でフォルダを選択
- 「追加」をクリック
- 「AI」の「ブラックボード」を選択して、アセットを作成
キーの追加
作成したブラックボードを開くと、既にSelfActorというActor型のキーがあります。
AIの移動目標となるキーも必要なので、もう一つActor型のキーを追加します。
- 「新規キー」をクリック
- 「Object」を選択してキーを追加し、名前を入力
- 追加したキーを選択
- 「詳細」の「Base Class」を「Actor」に変更
ビヘイビアツリーの作成
ビヘイビアツリーでは、ツリー形式でAIプログラムを作成します。
同じ処理をブループリントで作ることもできますが、よりAIプログラム向けの機能といった感じです。
このアセットは、AI Controllerブループリントのイベントグラフで、「Run Behavior Tree」ノードに設定して利用します。
アセットの作成
- 「コンテンツブラウザ」でフォルダを選択
- 「追加」をクリック
- 「AI」の「ビヘイビアツリー」を選択して、アセットを作成
ブラックボードの設定
作成済みブラックボードを、ビヘイビアツリーに設定します。
- ビヘイビアツリーを開く
- 「詳細」の「Blackboard Asset」に、ブラックボードを設定
Sequenceノードの追加
Rootノードに繋げて、Sequenceノードを追加します。
Sequenceノードは、下に繋いだ処理を、処理の成否に関わらず左から順に実行します。
- 処理の起点となるRootノード下部の黒いエリアをドラッグ&ドロップ
- 開いたウィンドウで「Sequence」を選択して、ノードがつながった状態で追加
ビヘイビアツリー内で右クリックすることでも、追加ノードを選択するウィンドウは開きます。
Waitノード、Move Toノードの追加
Sequenceノードに繋げて、WaitノードとMove Toノードを追加します。
WaitノードはAIに指定時間待機させ、Move Toノードはナビメッシュを利用して目標位置に移動させます。
- Sequenceノード下部の黒いエリアをドラッグ&ドロップ
- 開いたウィンドウで「Wait」または「Move To」を選択して、ノードを追加
Waitノードの設定
今回は待機時間を3秒に設定します。
- Waitノードを選択して、「詳細」の「Wait Time」を3に設定
Move Toノードの設定
今回は移動目標をブラックボードのTargetActorキーに取得したActorにします。
- Move Toノードを選択
- 「詳細」の「Blackboard Key」に「TargetActor」を設定
TargetActorに取得しているActorの変更を検知して移動目標を変えたい場合は、上にある「Observe Blackboard Value」にチェックを入れる必要があります。
AI Controllerブループリントの作成
AI Controllerブループリントでは、ブループリントでAIプログラムを作成します。
ビヘイビアツリーとの使い分けが悩ましいですが、ブラックボードのキーへの値の取得は、AI Controllerブループリントで行います。
このアセットは、敵キャラクターブループリントの「AI Controller Class」に設定して利用します。
アセットの作成
- 「コンテンツブラウザ」でフォルダを選択
- 「追加」をクリック
- 「ブループリントクラス」を選択
- 「親クラスを選択」ウィンドウで「AI Controller」を検索して選択し、アセットを作成
イベントグラフの作成
イベントグラフで、ビヘイビアツリーを起動させる処理と、ブラックボードのキーに値を設定する処理を作成します。
全体
全体としては、ゲーム開始時にビヘイビアツリーを起動し、ブラックボードのキーに値を設定する流れです。
詳細1
- 「Event BeginPlay」でゲーム開始時に処理を実行
- 「Run Behavior Tree」でビヘイビアツリーを指定して起動
詳細2
- 「Set Value as Object」でブラックボードのキーを指定して、値を設定
- キーの指定には「Make Literal Name」を使用
敵キャラクターブループリントの作成
敵キャラクターブループリントでは、スケルタルメッシュ、アニメーションブループリント、AI Controllerブループリント、Character Movement Componentのパラメータなどを設定します。
アセットの作成
- 「コンテンツブラウザ」でフォルダを選択
- 「追加」をクリック
- 「ブループリントクラス」を選択
- 「親クラスを選択」ウィンドウで「Character」を選択して、アセットを作成
メッシュの設定
スケルタルメッシュとアニメーションブループリントは、プレイヤーキャラクターのものを流用します。
- ブループリントを開いて、「コンポーネント」の「Mesh」を選択
- 「Skeletal Mesh Asset」にスケルタルメッシュを設定
- 「Anim Class」にアニメーションブループリントを設定
- 「トランスフォーム」で位置と向きを調整
ブループリントクラスの設定
旋回に影響する「Use Controller Rotation Yaw」とAI Controller関係の設定を行います。
- 「コンポーネント」のブループリントを選択
- 「Use Controller Rotation Yaw」のチェックを外す
- 「Auto Possess AI」を「Placed in World or Spawned」に変更
- 「AI Controller Class」に作成したAI Controllerブループリントを設定
Character Movement Componentの設定
キャラクターの向きに影響する「Orient Rotation to Movement」と、必要に応じて「Max Walk Speed」などのキャラクターに合わせた設定を行います。
- 「コンポーネント」の「Character Movement Component」を選択
- 「Orient Rotation to Movement」にチェックを入れる
- キャラクターに合わせて、「Max Walk Speed」などを設定
これで、レベルに敵キャラクターを配置してプレイすれば、ナビメッシュの範囲内で、敵キャラクターがプレイヤーキャラクターに向かって移動し、近くまで来ると待機します。
ただ、このままではプレイヤーキャラクターが空中にいる(=ナビメッシュに触れていない)時に敵キャラクターの移動が止まってしまう問題があります。
ここからはビヘイビアツリータスクブループリントを使って、その問題を解決し、ついでに敵キャラクターが常にプレイヤーキャラクターの方を向いて移動するようにします。
ビヘイビアツリータスクブループリントの作成
ビヘイビアツリータスクブループリントでは、ビヘイビアツリーで使ったMove Toノードなどの代わりに、独自のタスクノードをブループリントで作成できます。
アセットの作成
- ビヘイビアツリー上部のメニューで、「新規タスク」をクリック
- 「BTTask_BlueprintBase」を選択
- 「アセットに名前を付けて保存」ウィンドウで、保存先と名前を決め、「保存」でアセットを作成
イベントグラフの作成
アセットを作成すると、作成したアセットが開くのでイベントグラフで処理を作成します。
全体
イベントグラフが大きいため、全体の概略のみ紹介します。
- タスク開始時に処理を実行する「Event Receive Execute AI」で、変数を取得
- タスク中Tickごとに処理を実行する「Event Receive Tick AI」で
- 自身の最大旋回角度と必要旋回角度を計算
- 旋回しすぎないように角度を調整して旋回
- 自身と目標の位置で地面上の座標を取得して経路探索
- 自身の近くにある経路点を削除
- 残った経路点のうち、次の経路点の方向に移動
覚え書き
今後必要になりそうなノードのメモです。
Finish Executeノード
タスクを終了して、タスクの成否をBoolean型で返します。
このノードを実行しなければタスクが終了しません。
ビヘイビアツリーに追加
コンパイルしたブループリントのタスクノードをビヘイビアツリーに追加します。
- Sequenceノード下部の黒いエリアをドラッグ&ドロップ
- 開いたウィンドウで作成したタスクを選択
以上です。
コメント