はじめに
Unreal Engine 5.4 では、StateTree アセットを別の StateTree 内にリンクする機能が導入されました。これにより、プロジェクトで StateTrees をビルドおよび再利用する際、よりモジュール化されたアプローチを取れるようになりました。
特定の機能を持つ State Tree を作成し、必要に応じてそれを再利用できます。
このガイドでは、シンプルな Stete Tree を作成し、それを「StateTree クイックスタート ガイド」で作成した Stete Tree にリンクする手順について説明します。
目標
このガイドでは、移動するターゲットがヒットしたときに回転する Stete Tree を作成します。この State Tree を、ターゲットの移動を処理する別の StateTree に外部アセットとして追加します。
目標
- ヒット時に移動するターゲットを回転させる、ヒットに反応する StateTree と StateTree タスクを新しく作成します。
- ヒットに反応する StateTree を ShootingTarget StateTree に外部アセットとして追加し、設定します。
- この新しい機能に対応するために、BP_ShootingTarget と STT_MoveAlongSpline を変更します。
1 - 前提条件
このガイドでは、「StateTree クイックスタート ガイド」で作成された StateTree を使用して、外部 StateTree の使用方法を説明します。このドキュメントの例のとおりに行うには、まずクイックスタート ガイドを完了させてください。
クイックスタート ガイドを完了したら、[Play (プレイ)] を押して動作を確認します。
2 - ターゲットを回転させる StateTree タスクを作成する
このセクションでは、移動するターゲットを回転させる StateTree タスクを作成します。
- コンテンツ ブラウザ を右クリックし、[Create Basic Asset (基本アセットを作成)] セクションから [Blueprint Class (ブループリント クラス)] をクリックします。
- [Pick Parent Class (親クラスを選択)] ウィンドウで、[All Classes (すべてのクラス)] を展開し、「StateTree Task Blueprint Base」を検索します。選択して [Select (選択)] をクリックします。
- アセットに「STT_RotateTarget」という名前を付けます。

-
「STT_RotateTarget」をダブルクリックして開きます。新しい変数を作成し、「ContextActor」という名前を付けます。
- [Details (詳細)] パネルに移動し、[Variable Type (変数の型)] ドロップダウンをクリックして、[Actor Object Reference] を選択します。
- [Category (カテゴリ)] テキストボックスをクリックし、「Context」と入力します。これにより、変数が StateTree 内のコンテキスト アクタに自動的にバインドされます。
- ブループリントを コンパイル して 保存 します。

-
[Functions (関数)] セクションに移動し、[Override (オーバーライド)] ドロップダウンをクリックします。EnterState をクリックして、[Event Graph (イベント グラフ)] に EventEnterState ノードを作成します。このプロセスを繰り返し、ExitState をクリックします。
- コンテキスト アクタ をイベント グラフにドラッグし、[Get ContextActor] を選択します。
- ContextActor からドラッグして、Add Actor Component By Class を検索して選択します。
- [Class (クラス)] ドロップダウンをクリックし、Rotating Movement Component を検索して選択します。

- Add Rotating Movement Component ノードの Return Value ピンを右クリックし、[Promote to Variable (変数へ昇格)] をクリックします。
- 変数に「RotatingMovementComp」という名前を付けます。
- RotatingMovementComp ピンからドラッグして、Set Rotation Rate を検索して選択し、Z の値として「720」を入力します。

- RotatingMovementComp を イベント グラフ にドラッグし、Get RotatingMovementComp を選択します。
- RotatingMovementComp からドラッグして、Is Valid を検索して選択します。
- EventEnterState ノードを Is Valid ノードに接続します。
- Is Valid ノードの Is Not Valid ピンを Add Rotating Movement Component ノードに接続します。

- RotatingMovementComp を イベント グラフ にドラッグし、Get RotatingMovementComp を選択します。
- RotatingMovementComp からドラッグして、Set Component Tick Enabled を検索して選択します。
- Enabled ピンをチェックして True に設定します。

- RotatingMovementComp を イベント グラフ にドラッグし、Get RotatingMovementComp を選択します。
- RotatingMovementComp からドラッグして、Set Component Tick Enabled を検索して選択します。
- Enabled ピンが False (チェックなし) に設定されていることを確認します。
- EventExitState ノードを SetComponentTickEnabled ノードに接続します。

-
ブループリント グラフが以下の例のようになっていることを確認します。
このセクションの結果
このセクションでは、ターゲット アクタに Rotating Actor component を追加して回転させる StateTree タスクを作成しました。
3 - ターゲットを回転させる StateTree を作成する
このセクションでは、移動するターゲットがヒットしたときに回転する StateTree を作成します。この StateTree は、StateTree クイックスタート ガイドの「ST_ShootingTarget」StateTree にリンクされます。
-
コンテンツ ブラウザを右クリックし、[Artificial Intelligence (AI)] > [StateTree] をクリックします。StateTree コンポーネントをクリックし、アセットに「ST_Reaction」という名前を付けます。
-
「ST_Reaction」をダブルクリックして開きます。[Schema] セクションを開き、[Context Actor Class (コンテキスト アクタ クラス)] ドロップダウンをクリックします。「BP_ShootingTarget」を検索して選択します。
-
[+Add State (ステートを追加)] をクリックして、新しいステートを作成します。ステートに「Reaction」という名前を付けます。
-
Delay Task (遅延タスク) を追加し、その [Duration (期間)] に「0.5」と入力します。次に、新しいタスクを追加し、ドロップダウンから [STT Rotate Target] を選択します。
-
Transition (変移) を作成し、[Trigger (トリガー)] を On State Completed に設定し、[Transition To (トランジション先)] を Tree Succeeded に設定します。
-
StateTree を コンパイル して 保存 します。
このセクションの結果
このセクションでは、STT_RotateTarget タスクを実行する ST_Reaction StateTree を作成しました。このタスクは、StateTree の実行時にターゲットを回転させます。
4 - 外部 StateTree を追加する
このセクションでは、ST_Reaction を外部 (リンクされた) StateTree として ST_ShootingTarget に追加します。
-
ST_ShootingTarget を開き、[+Add State] をクリックして新しいステートを作成します。ステートに「Hit Reaction」と名前を付けます。
-
「Hit Reaction」ステートを選択し、[Details] パネルに移動します。[Type] ドロップダウンをクリックし、[Linked Asset (リンクされたアセット)] を選択します。[Linked Asset] ドロップダウンをクリックし、「ST_Reaction」を選択します。
- Enter Condition (条件を入力) を追加し、[If] ドロップダウンをクリックして、[Integer Compare (整数比較)] を選択します。
- [Operator (演算子)] ドロップダウンをクリックし、[Less] を選択します。
- [Right] の値を「5」に設定します。
- [Left] ドロップダウンをクリックし、[Actor (アクタ)] > [Hit Count (ヒットカウント)] を選択します。

-
新しい Transition を追加し、[Trigger] を On State Completed に設定します。[Transition To] を [Idle] に設定します。
- MoveAlongSpline ステートを選択し、新しい Transition を作成します。
- [Trigger] ドロップダウンをクリックし、[On Event] を選択します。
- [Event Tag (イベント タグ)] ドロップダウンをクリックし、[Manage Gameplay Tags (ゲームプレイ タグを管理)] を選択します。

-
+ ボタンをクリックして、StateTree という新しいエントリを追加します。その下に別のエントリを追加し、以下のように「HitReaction」という名前を付けます。
-
[Event Tag] ドロップダウンをクリックし、[StateTree] > [Hit Reaction] を選択します。[Transition To] を [Hit Reaction] に設定します。
このセクションの結果
このセクションでは、Hit Reaction ステートに外部 StateTree として ST_Reaction を追加して、ST_ShootingTarget を変更しました。また、ゲームプレイ イベントが呼び出されたときに Hit Reaction に遷移するように MoveAlongSpline ステートを変更しました。
5 - BP_ShootingTarget を変更する
このセクションでは、ShootingTarget ブループリントを変更して、Hit Reaction イベントを StateTree に送信し、ターゲットを回転させます。
-
コンテンツ ブラウザ で、「BP_ShootingTarget」をダブルクリックして開きます。新しい フロート変数を作成し、「DistanceTraveled」という名前を付けます。
- StateTree コンポーネントを イベント グラフ にドラッグします。
- StateTree 参照からドラッグして、Send State Tree Event を検索して選択します。
- ++ ノードを Send State Tree Event ノードに接続します。

-
Send State Tree Event ノードの Event ピンからドラッグし、Make StateTree Event を検索して選択します。
-
[Tag] ドロップダウンをクリックし、[StateTree] > [Hit Reaction] を選択します。
- OnComponentHit ノードの Hit Component ピンからドラッグして、Get Display Name (表示名を取得) を検索して選択します。
- Get Display Name ノードの Return Value ピンからドラッグし、Make StateTree Event ノードの Origin ピンに接続します。

- ブループリントを コンパイル して 保存 します。
このセクションの結果
このセクションでは、ShootingTarget ブループリントを変更して、ヒットしたときに StateTree Hit Reaction イベントを送信するようにしました。
6 - STT_MoveAlongSpline を変更する
このセクションでは、STT_MoveAlongSpline を変更して、ローカル距離変数の代わりに BP_ShootingTarget の DistanceTraveled 変数を使用して、スプラインに沿った位置を計算します。
-
コンテンツ ブラウザ で、「STT_MoveAlongSpline」をダブルクリックして開きます。[Functions (関数)] の隣にある [Override (オーバーライド)] ドロップダウンをクリックして EnterState を選択し、[Event Graph] で Event EnterState ノードを作成します。
- Actor 変数を [Event Graph] にドラッグし、[Get Actor (アクタをゲット)] を選択します。
- アクタ からドラッグして、Cast to BP_ShootingTarget を検索して選択します。
- Cast to BP_ShootingTarget ノードの As BP_ShootingTarget ピンを右クリックし、[Promote to Variable] を選択します。
- Event EnterState ノードを Cast to BP_ShootingTarget ノードに接続します。

- AsBPShootingTarget を イベント グラフ にドラッグし、Get AsBPShootingTarget を選択します。
- AsBPShootingTarget からドラッグして、Get Distance Traveled を検索して選択します。
- DistanceTraveled を Get Location at Distance Along Spline ノードの Distance ピンに接続します。これにより、現在の接続が Distance に置き換えられます。

- AsBPShootingTarget を イベント グラフ にドラッグし、Get AsBPShootingTarget を選択します。
- AsBPShootingTarget からドラッグして、Get Distance Traveled を検索して選択します。
- DistanceTraveled を Less Than ノードに接続し、接続を Distance に置き換えます。

- AsBPShootingTarget を イベント グラフ にドラッグし、Get AsBPShootingTarget を選択します。
- AsBPShootingTarget からドラッグして、Get Distance Traveled を検索して選択します。
- DistanceTraveled を + ノードに接続し、接続を Distance に置き換えます。
- AsBPShootingTarget を イベント グラフ にドラッグし、Get AsBPShootingTarget を選択します。そのノードからドラッグし、Set DistanceTraveled を検索して選択します。
- Branch ノードの True ピンに接続されている Set Distance ノードを置き換えます。

- AsBPShootingTarget を イベント グラフ にドラッグし、Get AsBPShootingTarget を選択します。
- そのノードからドラッグし、Set DistanceTraveled を検索して選択します。
- Branch ノードの True ピンに接続されている Set Distance ノードを置き換えます。

- ブループリントを コンパイル して 保存 します。
このセクションの結果
このセクションでは、ローカルの Distance 変数の代わりに、BP_ShootingTarget の DistanceTraveled 変数を使用するように STT_MoveAlongSpline を変更しました。
7 - 結果をテストする
[Play (プレイ)] を押して、ターゲットを撃ちます。ヒットするとターゲットが回転し、0.5 秒後に動きを再開します。
