6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【UE5】StateTreeからBehaviorTreeを動かしてみた

6
Posted at

はじめに

この記事は、Unreal Engine (UE) Advent Calendar 2025の14日目の記事です。
今回はStateTreeからBehaviorTreeを呼び出す方法を紹介します。
StateTreeは状態遷移を管理することに優れており、最近の公式サンプルでもBehaviorTreeに代わってAIを実装するのに使用されています。
しかし細かな状態が増えると状態遷移が複雑になることは想像に難くないです。FF15の意思決定ツールでは、ざっくりと大まかな状態遷移の管理をStateTreeで行い、各状態の具体的な行動をBehaviorTreeで行うといった役割分担をしているそうです。今回はその初歩的なものをやってみます。

環境

Windows11
UE5.6(Launcher版)

下準備

UE5.6でThird Person Template(Combat)を作成して、この中にあるAI用のCharacterとControllerを利用します。

image.png

StateTreeを作成します。今回AIControllerにStateTreeを持たせたいので「StateTree AI Component」を選択します。

image.png

作成したStateTreeを開き、AIControllerとContextActorを設定します。
AIController Class : BP_CombatAIController
Context Actor Class : BP_CombatEnemy
image.png

次にAIControllerの設定です。BP_CombatAIControllerを開きます。
StateTreeAI Componentを追加します。
image.png

追加したコンポーネントを選択して、Detailsから先ほど作成したStateTreeアセットを設定します。
image.png

最後にClass Defaultsの「Start AILogic on Possess」をオフにしておきます。この項目と、StateTreeAIコンポーネントの「Start Logic Automatically」どちらもオンになっていると二重に実行されます。
image.png

AIControllerの実装

AIControllerでは、受け取ったBehaviorTreeアセットを実行する関数と、BehaviorTreeが終了したことを通知するためのイベントディスパッチャーを用意します。

関数については、RunBehaviorTreeを実行するだけです。
image.png

そしてイベントディスパッチャーを作成しておきます。
image.png

StateTreeの実装

Stateの作成

まずは必要なStateを追加します。今回は紫色をBehaviorTreeとして処理を実行しているState、緑色をStateTreeとして処理を実行しているStateというイメージでやっています。
(「Move」StateでBehaviorTreeを呼び出すようにしても問題ないです)
image.png

「Move」と「Idle」は確認用にテキスト表示したりDelayを入れているだけなので説明は割愛します。一応「Idle」は下画像のようなTransitionを入れています。
image.png

「RunBehaviorTree」Stateには、BehaviorTree実行用のカスタムタスクと、終了待機できるようにTransition設定をしています。次はこのカスタムタスクを作成します。

image.png

カスタムタスクの作成

カスタムタスクを作成するには、StateTree内の「NewTask」から「State Tree Task Blueprint Base」を選択するのが楽です。
image.png

名前と保存先を決めて作成したタスクを開きます。
まずはAIControllerを受け取るための変数を作成して公開します。
image.png

次に関数のオーバーライドで「EnterState」と「ExitState」を作成します。
image.png

「EnterState」ではAIControllerに実装したBehaviorTreeを実行する関数を呼び出し、イベントディスパッチャーをBindしています。引数に渡すBehaviorTreeアセットはこれから作成します。
「ExitState」ではUnBindする処理だけしています。
image.png

BehaviorTreeの実装

最後の実装です。今回はプレイヤーの方を向いて追いかけてくるだけのシンプルなものを作成します。主旨とは外れるため細かい説明は割愛させていただきます。
作成したBlackBoardは以下です。プレイヤーの参照を持つためのKeyだけ追加しました。
image.png

作成したBehaviorTreeです。
image.png

BTT_GetPlayerInfoでは、プレイヤーの参照をBlackBoardのKeyに登録しています。
image.png

BTT_FinishBTでは、BehaviorTreeの処理が終了したことを通知して、「StopLogic」でBehaviorTreeを停止しています。この停止処理を入れないと、再びStateTree側でBehaviorTreeを実行しようとしたときに上手くいきません。
image.png

パッと見、「StopLogic」を呼ぶとStateTreeの処理も止まってしまう気がするのですが、StateTreeとBehaviorTreeは別々のコンポーネントシステムなので問題ないです。
image.png

作成したBehaviorTreeアセットを、StateTreeで作成したカスタムタスク内の関数の引数に設定したら実装は完了です。

完成!

これでStateTreeからBehaviorTreeを動かす仕組みができました!
NavMeshBoundsVolumeとBP_CombatAIEnemyをレベルに配置して動かした例です。
AdCal2025.gif

おわりに

FF15の意思決定ツールに憧れて今回の記事を書いてみました。何やっているか気になる人は参考文献に載せてあるのでご覧ください。
今度は逆にBehaviorTreeからStateTreeを呼び出せるようにして、もう少しまとまった仕組みを作りたいですね。

参考文献

書籍

GDCでの講演まとめ記事

論文

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?