概要
StateTree は汎用の階層型ステート マシンで、behavior tree の セレクター とステート マシンの ステート および 遷移 を組み合わせたものです。ユーザーは柔軟性のある高性能なロジックを作成したり、それを整理された状態に維持したりできます。
State Tree の詳細については、「State Treeの概要」に関するドキュメントを参照してください。
目的
このガイドでは、State Tree を使用して、プレイヤーが撃って破壊できる移動するターゲットを作成します。
目標
-
プレイヤーが撃って破壊できるターゲット アクタの ブループリント を作成します。
-
ターゲット アクタを移動および破棄するロジックを含む State Tree を作成します。
-
State Tree Task を作成し、それらを State Tree で使用します。
-
State Tree Evaluator を作成し、それらを State Tree で使用します。
1 - 必要な設定
-
新規プロジェクトを作成して [Games (ゲーム)] カテゴリを選択し、「First Person」テンプレートを選択します。プロジェクトの場所と名前を入力します。[Create (作成)] をクリックします。
クリックしてフルサイズで表示。
-
[Settings (設定)] > [Plugins (プラグイン)] をクリックして、[Plugins (プラグイン)] ウィンドウを開きます。
-
GameplayStateTree および StateTree プラグインを検索して 有効 にします。Unreal Engine エディタを再起動します。
このセクションの結果
このセクションでは、新しいプロジェクトを作成し、State Tree プラグインを有効にしました。これで、ターゲット アクタで使用する State Tree を作成する準備が整いました。
2 - State Tree を作成する
このセクションでは、ターゲット アクタが使用する State Tree を作成します。この State Tree は、ターゲット アクタのコンポーネントとして使用することを目的としているため、この例では State Tree Component Schema を使用します。
-
コンテンツ ブラウザ で、右クリックして [Artificial Intelligence] > [StateTree] を選択します。
-
StateTreeComponentSchema クラスを選択し、[Select (選択)] をクリックします。
-
ステートに「Tree ST_ShootingTarget」という名前を付けます。
このセクションの結果
このセクションでは、ターゲット アクタによって使用されるコンポーネント スキーマを用いて State Tree を作成しました。
3 - シューティング ターゲットのブループリントを作成する
このセクションでは、プレイヤーから攻撃を受ける移動可能なターゲット アクタのブループリントを作成します。
-
コンテンツ ブラウザ 内で右クリックし、[Create Basic Asset (基本アセットの作成)] セクションの [Blueprint Class (ブループリント クラス)] を選択します。
1.[Pick Parent Class (親クラスを選択)] ウィンドウで、[Actor (アクタ)] ボタンをクリックして、新しいアクタのブループリントを作成します。
1.ブループリントに「BP_ShootingTarget」という名前を付けます。
-
「BP_ShootingTarget」を開き、[Components (コンポーネント)] ウィンドウに移動します。[+Add (+ 追加)] をクリックし、スタティックメッシュ を選択します。
1.[Details (詳細)] パネルに移動して、[Static Mesh (スタティックメッシュ)] セクションまで下にスクロールします。
1.[Static Mesh (スタティックメッシュ)] ドロップダウンをクリックし、「1M_Cube」を選択します。
-
スタティックメッシュ の [Scale (スケール)] を X = 0.2、Y = 2.0、Z = 2.0 に設定します。
-
[Components (コンポーネント)] ウィンドウで、[+Add] をクリックし、StateTree を選択します。
1.[Details] パネルに移動し、[AI] セクションまで下にスクロールします。
1.[State Tree] ドロップダウンをクリックし、「ST_ShootingTarget」を選択します。
ドロップダウンに [State Tree] が表示されない場合は、誤ったスキーマが選択されていることを意味しています。State Tree コンポーネントで使用する StateTreeComponentSchema が選択されていることを確認してください。
-
スタティックメッシュ コンポーネントを右クリックし、[Add Event (イベントの追加)] > [Add OnComponentHit (OnComponentHit の追加)] を選択します。
-
新しい変数を作成し、「HitCount」という名前を付けます。
1.[Details] パネルに移動し、[Variable Type (変数の型)] を [Integer (整数)] に設定します。
-
HitCount 変数を [Event Graph (イベント グラフ)] にドラッグし、Get HitCount を選択します。
1.HitCount ノードからドラッグし、Increment Int を検索して選択します。
1.On Component Hit ノードを Increment Int ノードに接続します。
-
[Event Graph] で右クリックし、[Add Custom Event (カスタム イベントを追加)] を検索して選択します。イベントに「DelayedDestroy」という名前を付けます。
-
DelayedDestroy ノードからドラッグし、Delay を検索して選択します。
-
Delay ノードからドラッグし、Destroy Actor を検索して選択します。
このセクションの結果
このセクションでは、プレイヤーがゲームプレイ中に撃つ、シューティング アクタのブループリントを作成しました。これで、State Tree の Idle ステートと Dead ステートを作成する準備が整いました。
4 - Idle ステートと Dead ステートを作成する
-
「ST_ShootingTarget」に戻り、[Schema (スキーマ)] セクションで [Context Actor Class (コンテキスト アクタ クラス)] ドロップダウンをクリックします。「BP_ShootingTarget」を選択します。
-
[+ Add State (+ ステートを追加)] をクリックして新しいステートを作成し、「Idle」という名前を付けます。
-
[Details] パネルに移動し、[Transitions (遷移)] セクションまで下にスクロールします。
1.[Go to State (ステートに移動)] セクションを展開し、[Transition To (次に遷移)] ドロップダウンをクリックします。[Root (ルート)] を選択します。これにより、このステートが完了すると、State Tree が Root ステートに戻るように設定されます。
- [Trigger (トリガー)] ドロップダウンをクリックし、[On State Completed (オンステート完了)] を選択します。
-
別のステートを作成し、「Dead」という名前を付けます。
-
Idle ステートを選択し、別の Transition を追加します。
1.[Trigger (トリガー)] ドロップダウンをクリックし、[On Tick (ティック時)] を選択します。
1.[Transition To (次に遷移)] ドロップダウンをクリックし、[Dead] を選択します。
-
プラス記号 をクリックして、新しい Condition を追加します。ドロップダウンをクリックして [Integer Compare (整数と比較)] を選択します。
1.構造を展開し、[Left Bind (左バインド)] ドロップダウンをクリックして、[Actor (アクタ)] > [Hit Count (ヒットカウント)] を選択します。これにより、「BP_ShootingTarget」内の [Hit Count] の値が StateTree Condition にバインドされます。
1.Right 整数の値として「5」を入力します。
このセクションの結果
このセクションでは、State Tree に Idle ステートと Dead ステートを追加しました。これで、Dead ステートを処理する State Tree Task を作成する準備が整いました。
5 - 新しい State Tree タスクを作成する
このセクションでは、Dead ステートが実行されたときにアクタを破棄する新しい State Tree Task を作成します。
-
コンテンツ ブラウザ で、右クリックして [Blueprint Class] を選択します。
1.[Pick Parent Class (親クラスを選択)] ウィンドウで [All Classes (すべてのクラス)] ドロップダウンを展開し、「StateTreeTaskBlueprintBase」を検索して選択します。
1.[Select (選択)] をクリックしてアセットを作成します。
1.ブループリント クラスに「STT_Destroy」という名前を付けます。
-
コンテンツ ブラウザ で「STT_Destroy」をダブルクリックして開きます。[Functions (関数)] セクションに移動し、[Override (オーバーライド)] ドロップダウンをクリックします。[ExitState] を選択します。
-
新しい変数を作成し、「Actor」という名前を付けます。タイプを [Actor Object Reference (アクタ オブジェクト参照)] に設定します。
1.[Details] パネルに移動し、[Category (カテゴリ)] フィールドをクリックします。「Context」と入力します。
1.Actor 変数を [Event Graph] にドラッグし、[Get Actor (アクタをゲット)] を選択します。
1.Actor ノードからドラッグし、Cast to BP_ShootingTarget を検索して選択します。
- Cast to BP_ShootingTarget ノードの As BP Shooting Target ピンからドラッグし、Delayed Destroy を検索して選択します。
1.Event ExitState ノードを Cast to BP_ShootingTarget ノードに接続します。
このセクションの結果
このセクションでは、Dead ステートが実行されると起動する新しい State Tree Task を作成しました。このタスクによって、アクタが破棄されます。
6 - Dead ステートを終わらせる
-
「ST_ShootingTarget」に戻り、Dead ステートを選択します。新しい Task を追加し、ドロップダウンから [Debug Text Task] を選択します。
1.[Text (テキスト)] フィールドに「Actor Destroyed」と入力します。
1.[Text Color (テキストの色)] と [Font Scale (フォント スケール)] を入力します。
-
別の Task を追加し、ドロップダウンから [Delay Task (遅延タスク)] を選択します。
1.[Duration (持続時間)] に「2.0」を入力します。
-
3 つ目の Task を追加し、ドロップダウンから「STT_Destroy」を選択します。これにより、アクタが破棄されます。
-
新しい Transition を作成し、[Trigger] を [On State Completed (オン ステート完了)] に設定します。
1.[Transition To] ドロップダウンを [Tree Succeeded (ツリー成功)] に設定します。
-
「BP_ShootingTarget」をレベルにドラッグし、[Play (プレイ)] を押します。ブループリントを動作させ、State Tree が機能していることを確認します。
このセクションの結果
このセクションでは、Dead ステートを完了し、シューティング アクタ ブループリントがダメージを受けて破壊できることをテストしました。
7 - スプライン パスを追加する
このセクションでは、スプライン コンポーネントを使用してアクタを作成します。このスプラインで、シューティング ターゲット ブループリントがレベル内を移動できるようにします。
-
コンテンツ ブラウザ 内で右クリックし、[Create Basic Asset (基本アセットの作成)] セクションの [Blueprint Class (ブループリント クラス)] を選択します。
1.[Pick Parent Class (親クラスを選択)] ウィンドウで、[Actor (アクタ)] ボタンをクリックして、新しいアクタのブループリントを作成します。
1.ブループリントに「BP_SplineActor」という名前を付けます。
-
「BP_SplineActor」を開き、[Components (コンポーネント)] ウィンドウに移動します。[+Add (+ 追加)] をクリックし、[Spline] を選択します。
1.ブループリントを コンパイル して 保存 します。
このセクションの結果
このセクションでは、スプライン コンポーネントを持つ一般的なブループリント アクタを作成しました。このスプラインは、レベルでシューティング アクタが移動するパスを作成するために使用されます。
8 - State Tree Evaluator を追加する
ここで、レベル内のすべてのスプライン アクタを検索し、State Tree に最も近いものを返す State Tree Evaluator を作成します。
-
コンテンツ ブラウザ 内で右クリックし、[Create Basic Asset (基本アセットの作成)] セクションの [Blueprint Class (ブループリント クラス)] を選択します。
1.[Pick Parent Class (親クラスを選択)] ウィンドウで [All Classes (すべてのクラス)] ドロップダウンを展開し、「StateTreeEvaluatorBlueprintBase」を検索して選択します。
1.[Select (選択)] をクリックしてアセットを作成します。
1.ブループリント クラスに「STE_GetSpline」という名前を付けます。
-
「STE_GetSpline」を開き、[My Blueprint (マイ ブループリント)] パネルの [Functions (関数)] セクションに移動します。
1.[Override] ドロップダウンをクリックし、[TreeStart] を選択します。
-
Event TreeStart ノードからドラッグし、「Get All Actors of Class」を検索して選択します。
1.[Actor Class (アクタのクラス)] ドロップダウンをクリックし、「BP_SplineActor」を選択します。
-
新しい変数を作成し、「Actor」という名前を付けます。
1.[Details] パネルに移動し、[Variable Type (変数の型)] を [Actor Object Reference (アクタ オブジェクト参照)] に設定します。
1.[Category (カテゴリ)] ドロップダウンをクリックし、「Context」と入力します。
-
Get All Actors from Class ノードの Out Actors ピンからドラッグし、Find Nearest Actor を検索して選択します。
1.Actor 変数を [Event Graph] にドラッグし、[Get Actor (アクタをゲット)] を選択します。
1.Actor ノードからドラッグし、Get Actor Location を検索して選択します。
1.Get Actor Location ノードの Return Value (戻り値) を Find Nearest Actor ノードの Origin (原点) ピンに接続します。
-
Find Nearest Actor ノードの Return Value ピンからドラッグし、「Cast to BP_SplineActor」を検索して選択します。
1.Cast to BP_SplineActor ノードの As BP Spline Actor ピンを右クリックし、[Promote to Variable (変数へ昇格)] を選択します。
1.この変数に SplineActor という名前を付け、その [Category] に「Output」と入力します。
1.ブループリントを コンパイル して 保存 します。
-
「ST_ShootingTarget」に戻り、[StateTree] ウィンドウの下で、Evaluators の横にある [プラス記号] をクリックします。
1.ドロップダウンをクリックして [STE_GetSpline] を選択します。
このセクションの結果
このセクションでは、State Tree の始動時に実行される State Tree Evaluator を作成しました。この Evaluator はレベル内のすべてのスプライン アクタをチェックし、シューティング アクタに最も近いものを返します。
9 - スプラインに沿って移動する State Tree タスクを追加する
このセクションでは、アクタを「BP_SplineActor」のスプラインに沿って移動させる新しい State Tree Task を作成します。
-
コンテンツ ブラウザ で、右クリックして [Blueprint Class] を選択します。
1.[Pick Parent Class (親クラスを選択)] ウィンドウで [All Classes (すべてのクラス)] ドロップダウンを展開し、「StateTreeTaskBlueprintBase」を検索して選択します。
1.[Select (選択)] をクリックしてアセットを作成します。
1.ブループリント クラスに「STT_MoveAlongSpline」という名前を付けます。
-
「STT_MoveAlongSpline」を開き、[My Blueprint (マイ ブループリント)] パネルの [Functions (関数)] セクションに移動します。[Override] ドロップダウンをクリックし、[Tick] を選択します。
-
新しい変数を作成し、「Actor」という名前を付けます。
1.[Details] パネルに移動し、[Variable Type (変数の型)] を [Actor Object Reference (アクタ オブジェクト参照)] に設定します。
1.[Category (カテゴリ)] ドロップダウンをクリックし、「Context」と入力します。
-
新しい変数を作成し、「SplineActor」という名前を付けます。
1.[Details] パネルに移動し、[Variable Type (変数の型)] を [BP_SplineActor] に設定します。
1.[Category (カテゴリ)] として「Input」と入力します。
-
Actor 変数を [Event Graph] にドラッグし、[Get Actor (アクタをゲット)] を選択します。
1.Actor ノードからドラッグし、「Set Actor Location」を検索して選択します。
1.Tick ノードを Set Actor Location ノードに接続します。
-
SplineActor を [Event Graph] にドラッグし、Get Spline Actor を選択します。
1.SplineActor ノードからドラッグし、「Spline」を検索して選択します。
1.Spline ノードからドラッグし、Get Location at Distance Along Spline を検索して選択します。
1.Get Location の Return Value を Distance Along Spline ノードに接続し、さらにそれを Set Actor Location ノードの New Location ピンに接続します。
1.Get Location at Distance Along Spline ノードの Distance (距離) ピンを右クリックし、[Promote to Variable] を選択します。
-
Set Actor Location ノードからドラッグし、「Branch」を検索して選択します。
1.Distance 変数を [Event Graph] にドラッグし、[Get Distance] を選択します。
1.Distance ノードからドラッグし、「Less」を検索して選択します。
1.Less ノードを Branch ノードの Condition (条件) ピンに接続します。
-
SplineActor を [Event Graph] にドラッグし、Get Spline Actor を選択します。
1.SplineActor ノードからドラッグし、「Spline」を検索して選択します。
1.Spline ノードからドラッグし、「Get Spline Length」を検索して選択します。
1.Get Spline Length ノードからの Return Value を接続し、それを Less ノードの下のピンに接続します。
-
Distance 変数を [Event Graph] にドラッグし、[Get Distance] を選択します。
1.Distance ノードからドラッグし、「Add」を検索して選択します。
1.Float タイプの新しい変数を作成し、「MovementSpeed」という名前を付けます。
1.MovementSpeed を Add ノードの下のピンに接続します。
1.Distance 変数を [Event Graph] にドラッグし、[Set Distance] を選択します。
1.Add ノードを Set Distance ノードに接続します。
1.以下に示すように、Branch ノードの True ピンを Set Distance ノードに接続します。
-
MovementSpeed 変数を選択し、[Default (デフォルト)] の値を「5.0」に設定します。
-
Distance 変数を [Event Graph] にドラッグし、[Set Distance] を選択します。
1.Branch ノードの False ピンを Set Distance ノードに接続します。
1.Set Distance ノードからドラッグし、Finish Task 関数を検索して選択します。
このセクションの結果
このセクションでは、スプライン アクタ ブループリントで作成されたスプライン パスに沿って、シューティング アクタ ブループリントを移動させる State Tree Task を作成します。
10 - State Tree を完成させる
-
「ST_ShootingTarget」に戻り、[+Add State (+ ステートを追加)] をクリックします。新しいステートに「MoveAlongSpline」という名前を付けます。
1.MoveAlongSpline ステートをクリックして Idle ステートにドラッグし、親にします。
-
[Details] パネルに移動し、[+] ボタンをクリックして新しい Task を追加します。
1.ドロップダウン をクリックして「STT_MoveAlongSpline」を選択します。
1.Spline Actor の横にある [Bind (バインド)] ドロップダウンをクリックし、[STE Get Spline] > [Spline Actor] を選択します。
-
「BP_SplineActor」をレベルにドラッグします。
-
「BP_SplineActor」の Spline コンポーネントを選択します。Alt キーを押しながらドラッグ して、新しいスプライン ポイントを作成し、閉じた形状を作成します。
1.Spline Actor ブループリントの Spline コンポーネントを選択し、[Spline (スプライン)] セクションまでスクロールします。[Closed Loop (クローズドループ)] チェックボックスを 有効 にして、スプラインを閉じた形状にします。
-
[Play (プレイ)] を押して、ターゲットを撃ちます。