Signal EvaluateノードでState遷移の評価

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

今回はSignal Evaluateノードを使用してStateからの遷移の評価判定を行ってみましょう。
内容は以下の通りです。

  • Logic Behaviorコンポーネントの付いたGameObjectを作成する。
  • Logic Editorウィンドウでグラフを開いて編集する。
  • Signal Evaluateノードで時間経過を判定して遷移する。
  • 複数の条件判定で遷移する。

シーンを新規作成

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

  • メニューから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キーで確定

Signal Evaluateノードの作成

Signal Evaluateノードを作成します。

  • Startノードのシグナル出力ポートをドラッグ
  • 右側付近でドロップし、ノード作成メニューを開く
  • Scriptsタブを選択
  • 一覧からSignals > Signal Evaluateを選択
  • ノード名はそのままEnterキーで確定

シグナルワイヤーについて

Stateノードのシグナル出力ポートとSignal EvaluateノードのInputsリストのシグナル入力ポートシグナルワイヤーによって接続されています。
このシグナルワイヤーは、ステートの遷移条件を評価する信号を送るためのワイヤー(接続線)です。

Stateノードのヘッダ部にあるシグナル出力ポートは、Stateノードが実行されている間アクティブになり、接続先のSignal Evaluateノードで遷移条件が評価されます。

前回Stateノードで使用したWait For SecondsやButton.onClickのCompletedポートもこのシグナル出力ポートです。
CompletedポートからシグナルワイヤーでSignal Evaluateノードに接続した場合は、処理が完了した時にシグナルが送信されます。

ひとまず「シグナルが有効になった際にSignal Evaluateノードで遷移するか判定できる」と覚えてください。

Signal EvaluateノードにWait For Secondsを追加

Signal EvaluateノードのConditionsにWait For Secondsを追加します。

  • Signal EvaluateノードのConditionsの+ボタンをクリックし、ノードコンポーネント追加メニューを開く
    (Stateノードと同じく、マウスオーバーで挿入用の+ボタンも表示されます)
  • Scriptsタブを選択
  • 一覧からTasks > Wait For Secondsを選択

Wait For Secondsの設定

1秒待機するように設定します。

  • Secondsフィールド1に設定

Debug.LogのActionノードを作成

1秒経過後にDebug.Logが行われるようにActionノードを作成します。

  • Signal Evaluationノードのシグナル出力ポートをドラッグ
  • 右側付近でドロップし、ノード作成メニューを開く
  • Scriptsタブを選択
  • 一覧からActions > Debug > Debug.Logを選択
  • ノード名はそのままEnterキーで確定

Debug.Logの設定

Consoleに出力するメッセージを設定します。

  • MessageフィールドCompletedに設定

ここまでのプレイ確認

ここまでで一度プレイして動作を確認してみましょう。
グラフは以下のようになっています。

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

  • 1秒経過後にConsoleにCompletedと出力されることを確認。

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

Signal EvaluateノードにFloat Compareを追加

Wait For Secondsだけでは、Stateノードに直接使用した場合と違いが分からないかと思います。
そこで遷移条件をさらに追加してみましょう。
今回はConditionsにFloat Compareを追加します。

  • Signal EvaluateノードのConditionsの+ボタンをクリックし、ノードコンポーネント追加メニューを開く
    (Stateノードと同じく、マウスオーバーで挿入用の+ボタンも表示されます)
  • Scriptsタブを選択
  • 一覧からEvaluators > Float > Float Compareを選択

Float Compareの設定

floatの比較を「NPCの追跡対象との距離」に見立てて「一定範囲内なら真」という判定にしてみましょう。

  • Comparison Opフィールド<= (Less Than Or Equal)に設定
  • Value 1フィールド10に設定
    (現在の対象との距離を想定)
  • Value 2フィールド5に設定
    (判定範囲を想定)

プレイして確認

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

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

  • 1秒経過してもConsoleに出力されないことを確認。
  • Float CompareのValue 1フィールドをドラッグして減らし、数値が5以下になるとConsoleにCompletedと出力されることを確認。

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

なお、最初からValue 1フィールド5以下に設定している場合は、1秒経過後すぐに遷移します。
つまり1秒以上経過かつValue 1フィールドが5以下の場合に遷移する、という条件になっています。

シグナルの補足

判定の論理演算について

Signal EvaluationノードのInputsフィールドやConditionsフィールドにはInvertとAnd/Orの設定欄もあります。
この設定により複数の判定を組み合わせた複雑な遷移の評価が可能となります。

  • Invertを有効にすると、判定結果が反転します。
  • Andに設定すると、一つ上までの判定結果と自身の判定結果をAnd演算します。
  • Orに設定すると、一つ上までの判定結果と自身の判定結果をOr演算します。

今回の場合はWait For Seconds [AND] Float Compareです。
そのため「1秒経過 [AND] Value 1 <= Value 2」が遷移条件となります。

他のシグナル関連ノードについて

シグナルの判定に使用できるノードは他にも2種類あります。
詳細はマニュアルを参照してください

次回

次回は、「BehaviorTreeノードの使い方」を行います。

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