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