Branchノードで分岐

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

今回は、前回取得した乱数を判定しBranchノードで分岐をしてみましょう。
内容は以下の通りです。

  • メンバーアクセスで乱数取得で作成したシーンを開く
  • Logic Editorウィンドウでグラフを開いて編集する。
  • Float CompareのComputeノードで乱数を判定
  • Branchノードで分岐

「メンバーアクセスで乱数取得」のシーンを開く

前回のメンバーアクセスで乱数取得で行った内容を変更しますので、前回のシーンを開いていない場合は開いてください。

  • ProjectsウィンドウのAssets / MemberAccessシーンをダブルクリックして開く

シーンを別名で保存

改変したMemberAccessシーンを上書きしてしまうと混乱の元となりますので、あらかじめ別名で保存しておきましょう。

  • メニューからFile > SaveAs…を選択
  • Assetsフォルダを選択
  • Branchという名前で保存

Logic Editorウィンドウを開く

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

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

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

Float CompareのComputeノードを作成

Random.valueの結果を判定するためのノードを作成します。

  • Random.valueのValueポートをドラッグ
  • 右側付近のグラフビュー上へドロップし、ノード作成メニューを開く
  • Scriptsタブを選択
  • 検索バーにFloat Comapreと入力
  • 一覧からComputeノード用のFloat Compareを選択
    (検索しない場合はComputes > Float > Float Compare)
  • ノード名はそのままEnterキーで確定

Float Compareは2つのfloat型の値を比較して結果をbool型で出力します。

Float Compareの設定

今回は50%の確率で分岐したいと思います。

  • Value 2フィールドを0.5に設定
  • Comparison Opフィールドを< (Less Than)に設定

Resultポートの接続先へBranchノードを作成

Float Compareの結果を使用して分岐できるようにします。

  • Float CompareのResultポートをドラッグ
  • もともとあったDebug.Logの右側付近でドロップし、ノード作成メニューを開く
  • Scriptsタブを選択
  • 一覧からFlow Controls > Branchを選択

Branchノードについて

BranchノードはConditionフィールドのbool値が真か偽かによって遷移先を分岐するノードです。

今回の場合は、Random.valueが0.5未満であればTrue側のポートへ遷移し、0.5以上であればFalse側のポートに遷移します。

Debug.LogとBranchの接続

もともとあったDebug.LogのActionノードからBranchノードに遷移するように設定します。

  • Debug.LogのActionノードの遷移出力ポートをドラッグ
  • Branchノードの実行入力ポートにドロップ

Trueポートの接続先にDebug.Logを作成

判定結果が真の場合の分岐先でConsoleに出力しましょう。

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

True側Debug.Logの設定

Consoleに表示する文字列を設定します。

  • MessageフィールドTrueに設定

Falseポートの接続先にDebug.Logを作成

判定結果が偽の場合の分岐先もConsoleに出力しましょう。

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

False側Debug.Logの設定

Consoleに表示する文字列を設定します。

  • MessageフィールドFalseと入力

Get Random.valueの再演算の問題の解消

ここまででグラフの接続は完成しましたが、この状態でプレイ開始するとConsoleに出力された数値と判定結果が異なる問題が発生します。

0.73768510.5以上なのにTrueになっていたり、0.36886460.5未満なのにFalseになっており想定の動作になっていません。
なお、0.04413310.5未満でありTrueで正しいのですが偶然正しくなっただけです。

これは、Get Random.valueが毎回異なる乱数を取得することと、ActionノードとBranchノードの実行時にGet Random.valueがそれぞれ1回ずつ計2回呼ばれていることが原因です。

この問題を解消する方法はいくつかありますが、今回はGet Random.valueをフレーム単位で再演算するモードに設定します。

  • Get Random.valueの再演算モードをクリック
  • メニューからFrameを選択

設定すると以下のように再演算モードが緑のアイコンに切り替わります。

ActionノードでGet Random.valueを使用する方法もあります。
StartノードからGet Random.valueのActionノードに接続すればRandom.valueを1回だけ出力し同じ値を使用できるようになります。

プレイして確認

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

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

  • Consoleウィンドウに0.0から1.0までの間の数値が表示されることを確認。
    (ここまでは前回の内容)
  • 乱数値が0.5未満の場合にTrueと表示されることを確認。
  • 乱数値が0.5以上の場合にFalseと表示されることを確認。
  • 何回かプレイモードを切り替えて結果が変わることを確認。

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

再スタートするには?

この例では確認するには何度もプレイモードの切り替えが必要です。
Restartノードで最初に戻るで行ったように、Wait For SecondsとRestartノードを使用することで1秒経過後に再スタートさせることができます。

ただし、Branchは分岐後に自動的に合流されません。
もし分岐の結果によらずどちらの実行を行っても最終的に再スタートしたい場合は、両方のルートに個別に同じノードを作成する合流してからノードを作成する必要があります。
作業手順の詳細は省きますが、以下のようにすると合流して1秒経過後に再スタートするようになります。

Random Evaluateの紹介

今回のような乱数値の比較はよく使用するため、機能をまとめたRandom Evaluateというコンポーネントも組み込まれています。

Branchノードの条件判定にRandom Evaluateを使用する場合は以下のようになります。
(乱数値の出力は行われないため、Debug.Logなどの他ノードで数値は使用できません)

次回

次回は、Ifノードで分岐を行います。

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