Stateノードで状態管理

前回までの作業がまだ済んでいない場合は、基本的な使い方から前回までのチュートリアルを先に済ませてください。

今回はStateノードを使用して状態管理を行ってみましょう。
内容は以下の通りです。

  • Logic Behaviorコンポーネントの付いたGameObjectを作成する。
  • Logic Editorウィンドウでグラフを開いて編集する。
  • Stateノードで時間内にButtonのクリックを検知する。

シーンを新規作成

他のシーンを開いていると混乱の元となりますので、シーンを新規作成しましょう

  • メニューからFile > New Sceneを選択
  • New SceneウィンドウでBasic (URP)を選択
  • Createボタンをクリック

Logic Behavior付きGameObject作成

シーンにLogic Behaviorコンポーネントが追加された状態のGameObjectを作成します。

  • Hierarchyの+ボタンをクリック
  • メニューからLogic Toolkit > Logic Behaviorを選択
  • 名前はそのままEnterキーで確定。

Logic Editorウィンドウで開く

Logic BehaviorコンポーネントのグラフなどはLogic Editorウィンドウで編集します。
ウィンドウが表示されていない場合は、GameObjectを選択してInspectorの「Edit」ボタンをクリックすることで表示されます。

  • Logic Behaviorオブジェクトを選択
  • InspectorウィンドウのLogic BehaviorコンポーネントのEditボタンをクリック

すでにLogic Editorウィンドウが表示されている場合は、HierarchyウィンドウでのGameObject選択と連動してグラフが切り替わるようになります。

Stateノードの作成

Stateノードを作成します。

  • Startノードの実行出力ポートをドラッグ
  • 右側付近でドロップし、ノード作成メニューを開く
  • Scriptsタブを選択
  • Stateを選択
  • ノード名はそのままEnterキーで確定

Stateノードとは

Stateノードは、オブジェクトの状態を表すノードです。
例えば、敵のNPCの行動では「巡回&索敵状態」、「対象追跡状態」、「対象に攻撃状態」などが考えられます。

Logic ToolkitのStateノードでは、ActionComponentやTaskComponent、EventComponentなどを組み合わせて同時に実行することで状態を管理できます。

StateにWait For Secondsを追加

StateノードにWait For Secondsを追加します。

  • StateノードのComponentsの+ボタンをクリックし、ノードコンポーネント追加メニューを開く
  • Scriptsタブを選択
  • 一覧からTasks > Wait For Secondsを選択

Wait For Secondsの設定

ここでは5秒待機するように設定します。

  • Secondsフィールド5に設定

Debug.LogのActionノードの作成

Wait For SecondsのCompletedからDebug.Logに遷移します。

  • Wait For SecondsのCompletedポートをドラッグ
  • 右側付近でドロップし、ノード作成メニューを開く
  • 一覧からActions > Debug > Debug.Logを選択
  • ノード名はそのままEnterキーで確定

Debug.Logの設定

Consoleに出力する文字列を設定します。

  • MessageフィールドTime outに設定

Restartノードの作成

Debug.Logの次にRestartノードで最初に戻るように設定します。

  • Debug.LogのActionノードの遷移出力ポートをドラッグ
  • 右側付近でドロップし、ノード作成メニューを開く
  • Scriptsタブを選択
  • 一覧からFlow Controls > Restartを選択

StateにButton.onClickを追加

続いて、StateノードにButton.onClickを追加します。

  • Stateノードの下辺をマウスオーバーすることで表示された+ボタンをクリックし、ノードコンポーネント追加メニューを開く
  • Scriptsタブを選択
  • 検索欄にButton.onClickと入力
  • 一覧からButton.onClickを選択

Stateノードには複数のNodeComponentを設定できるため、ノード用コンポーネントを途中に挿入できる機能が備わっています。
先頭、NodeComponent同士の間、一番最後のそれぞれのスペースをマウスオーバーすると挿入用の+ボタンが表示されます。
またComponentsの+ボタンは一番最後に追加されます。
お好きな方をご利用ください。

ScriptsタブにButton.onClickがない場合

前回の「Eventノードでトリガー待ち受け」にてスクリプト生成をしているため、前回の内容を行っていない場合は以下の方法でButton.onClickを追加してください。

  • Stateノードの下辺をマウスオーバーすることで表示された+ボタンをクリックし、ノードコンポーネント追加メニューを開く
  • Membersタブを選択
  • 検索欄に Button.onClick と入力
  • 一覧からUnityEngine.UI.ButtononClickを選択
  • コンパイルが終わるのを待つ

Buttonの作成

シーンにButtonを作成します。

  • Hierarchyの+ボタンをクリック
  • メニューからUI > Button – TextMeshProを選択
  • もしTMP Importerウィンドウが表示されたらImport TMP Essentialsをクリック

Button.onClickの設定

作成したButtonを設定します

  • TargetフィールドをButtonに設定
    (参照タイプをSelfからValueに変更してからオブジェクトフィールドを設定するか、HierarchyのButtonオブジェクトをTargetフィールドにドラッグ&ドロップすることで設定できます)

Debug.LogとRestartを複製

既に作成しているDebug.LogとRestartをコピー&ペーストします。

  • Debug.LogのActionノードとRestartノードを選択
  • Ctrl C(Win)、⌘ C(Mac)を入力
  • Button.onClickのCompletedポートの右側付近でCtrl V(Win)、⌘ V(Mac)を入力

遷移ワイヤーの接続

Button.onClickと複製したDebug.LogのActionノードを接続します。

  • Button.onClickのCompletedポートをドラッグ
  • 複製したDebug.LogのActionノードの実行入力ポートにドロップ

Debug.Logの設定

Consoleに出力する文字列を設定します。

  • MessageフィールドClickedに設定

プレイして確認

ここまで作成するとグラフは以下のようになっています。

プレイボタンを押して挙動を確認します。

  • 5秒待機して、ConsoleにTime outと出力されることを確認。
  • Buttonをクリックすると、ConsoleにClickedと出力されることを確認。

Consoleウィンドウが表示されていない場合は、メニューからWindow > General > Consoleを選択して表示してください。

Stateについての補足

Stateノードは、ActionノードやTaskノードなどと同じく実行ワイヤーか遷移ワイヤーを接続することで実行できます。
基本的な扱いはActionやTaskと変わりありませんので、「Action→State→Task→If→State」などのように実行フローの中にそのままStateが組み込めます。

次回

次回は、Signal EvaluateノードでState遷移の評価を行います。

試用版でお試しの方は、お気に召しましたらアセットストアにてご購入ください。