はじめに
UE5でビヘイビアツリーを使って、ステルスゲームなどでよくある「巡回」→「敵追跡」→「見失ったら巡回に戻る」というロジックを組んでいこうと思います。
今回は、敵の移動ルートをスプラインで定義する方法を解説していこうと思います。
敵の移動ルートを指定するSplineクラスの作成
敵の移動ルートはスプラインで定義します。ということで、SplineComponentだけを保持する”BP_AITraceSpline”をActorを継承させて作成します。
作成したら編集画面のコンポーネントの追加から、Splineコンポーネントを追加してください。(SplineMeshコンポーネントというものも表示されますが、今回使用するのはSplineコンポーネントです)
スプラインBPをレベル上に配置
上記で作成した”BP_AITraceSpline”をレベル上に配置し、スプラインを使ってAIの巡回ルートを作成してください。スプラインは端っこのピンを選択しながらAltキー+左ドラッグで新たなポイントを作れます。また、注意点としてはスプラインは床から10cmくらいを這わせるように設置してください。
NavMeshBoundsVolumeをレベル上に配置
敵AIの移動範囲を指定する為に、NavMeshBoundsVolumeをレベル上に配置し、適切な大きさに変更してください。今回はサンプルなので、レベル全体を囲ってみました。
AIで動かす敵クラスの作成
AIで操作する敵キャラクターのBPを作成します。本来であれば、敵にも色々な種類を作りたくなると思いますので、敵基底BPクラスを作った方が良いのですが、今回は解説編の為、Characterを継承した単純な敵キャラクターとして”BP_AICharacter”を作成しました。MeshにはQuinnを選択し、AnimClassにはABP_Quinn_Cを選択しました。
また、変数として上記で作成した”BP_AITraceSpline”型のTraceSplineを追加し、インスタンス上から編集できるように目アイコンをONにしておきます。
敵BPをレベル上に配置し、移動ルートのスプラインと紐づける
ここまでで作成してきた敵BPをレベル上に配置します。
レベル上に配置した敵BPをクリックすると、「詳細」パネルの「デフォルト」欄で移動ルートを指定する”BP_AITraceSpline”を設定できるよになっているので、既にレベル上に配置しているBPを選択してください。
BehaviorTreeの作成
コンテンツドロワー上で右クリック->”AI”->”ビヘイビアツリー”を選択し、”BT_AICharacter”と名付けます。
作成したビヘイビアツリーをダブルクリックして開き、「新規ブラックボード」を選択し”BB_AICharacter”も作成しておきます。ただし、今回はブラックボードは使用しません。
AIControllerの作成
コンテンツドロワー上で右クリック->”ブループリントクラス”を選択し、すべてのクラスの中から”AIController”を選択します。名前は”AI_AICharacter”としました。
これをダブルクリックして開き、イベントグラフ内に以下のようなノードを組みます。(BeginPlayとTickノードは消してしまって構いません)
OnPossessノードから、RunBehaviorTreeノードを呼び出し、BTAssetには上記で作成しておいたビヘイビアツリーを選択します。
敵BPにAIControllerを紐づける
敵BPクラスを開き、上記で作成したAIControllerを紐づけます。
コンポーネントから一番上にある”BP_AICharacter(self)”を選択した状態で、詳細タブに”AI Controller Class”と入力すると、AIControllerを指定することが出来ますので、ここで上記で作成した”AI_AICharacter”を選択してください。(元々”AIController”が選択されているので、ちょっと分かりにくいですが、上記で作成した”AI_AICharacter”を選択してください。)
ビヘイビアツリータスクの作成
スプラインに沿って歩かせる為のロジックを組んでいきます。
上記で作成したビヘイビアツリーを開き、画面上部の「新規タスク」をクリックします。(リストが表示された場合は”BTTask_BlueprintBase”を選択してください)
新規でビヘイビアツリータスクを作成するダイアログが表示されるので”BTT_AICharacterTraceMove”という名前で作成してください。
まずは、Receive Execute AIノードから実装していきます。
ビヘイビアツリーから、このタスクが呼び出された時点で、AIControllerが紐づいている敵キャラクターに紐づけられた移動ルートを指定するSplineを取得し、変数にセットしています。その後、敵キャラクターのCharacterMovementコンポーネントから現在の最大速度を取得し、こちらも変数に保存しています。
次に、Receive Tick AIノードを実装します。
上記で取得しておいたスプラインに沿って、これまた上記で取得した歩く速度でキャラクターを移動させるだけのロジックとなります。スプライン上の移動距離は変数”NowSplineDistance”に保持しており、これがスプラインの全長を超えた場合はスプラインを一周したということで、距離を巻き戻す処理が入っています。Get Location at Distance Along Splineノードでスプライン上の移動距離からワールド座標を求めて、Move to Locationで敵キャラクターを歩かせています。
ビヘイビアツリー実装
今回はスプラインに合わせて歩かせるだけなので、ビヘイビアツリーは単純に以下のような処理となります。簡単に言えば、上記で作成したビヘイビアツリータスクの処理を繰り返しているだけです。
早速AIで制御された敵キャラクターを歩かせてみましょう
プレイボタンを押すと、敵キャラクターが歩いて・・・・くれません。
移動はしてくれるのですが、歩いてくれません。(UE4の場合は歩いてくれるかもしれません)
アニメーションBPを少し変更します
QuinnのアニメーションBPの親クラスであるABP_Mannyを開き、Should Move変数をセットする部分のロジックを少しだけ編集します。
下図の赤丸を付けた部分のロジック(Booleanの判定処理)を変えてみましょう。
これで、敵キャラクターがアニメーションするようになります。
無事にスプライン上を巡回させることができました。
次回は、敵がプレイヤーを発見した場合に追跡してくる処理を作成したいと思います。
No responses yet