PR

【UE5】AIで動く敵キャラクターの作り方

Unreal Engine 5

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ノード下部の黒いエリアをドラッグ&ドロップ
  • 開いたウィンドウで作成したタスクを選択

以上です。

コメント

タイトルとURLをコピーしました