BLOGブログ

2023.05.24UE5UE/ Blueprint

[UE5] StateTreeで状態管理

執筆バージョン: Unreal Engine 5.1

今回は、StateTreeについてです。
StateTreeとは、UE5で追加された状態管理をするステートマシンです。 AIやゲームプレイの状態管理に使えます。
ビヘイビアツリーと同様に、ツリー構造の階層を持った状態管理ができます。
UE5.0ではExperimentalでしたが、UE5.1ではプロダクション対応になったようです。

StateTreeの使用するまでの流れ

  1. StateTreeプラグインを有効にする GameplayStateTree・StateTreeの2つのプラグイン有効にし、再起動します。
  2. StateTreeアセットをコンテンツブラウザから作成します。
    [Artifical Interlligence(日本語の場合 AI)]→[State Tree]
  3. 任意のアクターにStateTreeコンポーネントを追加します。
  4. StateTreeコンポーネントに詳細パネルからStateTreeアセットを割り当てます。
  5. StateTreeコンポーネントの「Start Logic Automatically」にチェックがついていれば、実行時に自動でStateTreeが開始します。

StateTree エディタ画面

StateTreeのデータのやり取り方法

入力条件や遷移条件にプロパティ参照する機能がStateTreeにはあります。

① スキーマ(Schema)・コンテキスト(Context)
追加したいアクターのクラスを明示的に指定することにより、
StateTreeの入力条件や遷移条件に指定したクラスが持つプロパティを指定することができます。
② パラメータ (Parameters)
StateTree内でパラメータを管理したい場合はこちらで指定できます。 また、StateTreeコンポーネントの詳細からデフォルト値を設定することが可能になります。
③ エバリュエーター (Evaluators)
StateTreeコンポーネントから直接StateTree側へパラメータを渡すことができないため、
エバリュエーターを使用することにより、コンテキスト・StateTreeのパラメータ以外でデータを StateTreeで使用できるようになります。
UStateTreeEvaluatorBlueprintBaseクラスからブループリントを作成することにより使用することができます。 バリュエーターは以下の機能を持ちます。

  • StateTreeが実行が開始されると常時処理を実行されます。
  • プロパティは入力条件や遷移条件に使用することができます。

ステート詳細情報

ステート入力条件 (EnterCondition)

ステートを選択できるかどうかを決定する条件を設定します。

主に設定できるパラメータ (例:Integer Compare)

① 判定結果の反転(Invert)
② 比較方法(Operator)
③ 左辺値(Left)
「Bind」のリストボックスをクリックすると「StateTreeのデータのやり取り方法」で設定したオブジェクトやプロパティを選択し、参照することができます。
④ 右辺値(Right)
固定値を利用できますが、左辺値同様、Bindから参照するオブジェクト・プロパティを選択することができます。

カスタムの入力条件

デフォルトで用意されている入力条件の他にカスタム入力条件を追加することができます。
UStateTreeConditionBlueprintBaseクラスからブループリントを作成することにより、独自の入力条件を追加することが可能です。

タスク

ステートがアクティブ状態になった場合、実行される処理のひとまとまりになります。
タスクが完了するまで処理が実行され続けます。
タスクが完了した場合、Endイベントが呼ばれステートの遷移の判定が行われます。
条件に当てはまる遷移が無ければ次のステートに進みます。

タスクの作成

UStateTreeTaskBlueprintBaseからブループリントを作成することができます。
各処理の実装
タスクの開始、終了、毎フレーム処理は以下の関数をOverrideして追加してください

  • EnterState(タスクの開始時)
  • Tick(タスクの毎フレーム実行)
    リターンノードの値によってタスクの実行を持続・完了します。
  • ExitState(タスクの終了)
  • StateCompleted (タスクの完了)

パラメータを編集可能にする
プロパティの「Instance Editable」にチェックを入れると StateTreeのエディタ画面から設定できるようになります。

遷移(Transitions)の設定

現状のステートから別のステートに遷移条件・遷移先を設定します。

トリガー(Trigger)

遷移が実行される条件の種類を指定します。

  • Taskの終了(OnStateCompleted)
  • Taskの成功終了(OnStateSucceeded)
  • Taskの失敗終了(OnStateFailed)
  • 遷移条件が一致するまで実行(OnTick)
  • 外部からのイベント呼び出し(OnEvent)
    このトリガーを選択することにより、StateTreeコンポーネントのSendStateTreeEvent関数を利用し、 StateTreeの外部のブループリントからステートをを変更することが可能です。

遷移先(Transtion To)

遷移・トリガー条件を満たした場合やタスクが完了した後に遷移するステートを指定します。
主に以下のようなステートへ遷移先を指定することができます。

  • 他ステートへの遷移 (GOTO STATE)
    直接別ステートへ遷移先を指定することができます。
    (ビヘイビアツリーの場合は条件に一致しないと実行されないので、StateTreeツリーとの違いはここにあります。)
  • 同じ階層の下のステートへ遷移 (Next State)
  • 他のステートへ遷移しない (Block Transition)
    条件に当てはまる遷移が無ければ、次のステートへ遷移してしまいます。
    タスクの処理を実行し続ける場合こちらを指定してください。

条件(Conditions)

ステート入力条件と同様に遷移条件を指定することができます。
また、Taskのプロパティを条件のパラメータに使用することができます。

まとめ

StateTreeとビヘイビアツリーは異なるものなので、ビヘイビアツリーで作ったAIをそのまま移植することはできないのですが、
StateTreeのほうが、ステートマシンの実装に慣れている場合使いやすいとは思います。
個人的にはAI以外にもゲームプレイの状態管理(画面遷移等)にも利用しやすい機能だと思います。