Ifノードで分岐

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

今回はIfノードを使用して分岐を行ってみましょう。
内容は以下の通りです。

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

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

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

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

シーンを別名で保存

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

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

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の設定

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

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

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

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

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

Ifノードについて

IfノードはConditionsを上から順に判定し、条件に合致した要素を実行するノードです。

上から順に各条件を判定し、条件に合致場合はThenポートの接続先を実行します。
どの条件も満たさない場合は、Elseポートの接続先を実行します。
分岐先の実行が終了したらCompletedポートの接続先に遷移します。

今回の場合は、Random.valueが0.5未満かどうかを判定しThenポートを実行、それ以外であればElseポートを実行。完了後にCompletedポートの接続先に遷移します。

Debug.LogとIfの接続

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

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

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

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

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

Then側Debug.Logの設定

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

  • MessageフィールドTrueに設定

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

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

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

Else側Debug.Logの設定

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

  • MessageフィールドOtherwiseに設定

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

Ifノードの各分岐先の処理が終わったときもConsoleに出力しましょう。

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

Completed側Debug.Logの設定

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

  • MessageフィールドCompletedと入力

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

Get Random.valueの再演算モードをFrameに変更します。
再演算の問題についてはBranchノードで分岐の説明を参照してください。

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

プレイして確認

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

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

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

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

Branchノードとの違い

Branchノードでは1つの条件判定により、TrueかFalseのどちらかに遷移するという単純なものでした。

IfノードはConditionsの要素を追加でき、複雑な条件分岐ができます。
また各条件分岐先が実行完了するとCompletedポートの接続先に遷移する機能もあります。

Ifノードの方が高機能ですが、単純な分岐の方が分かりやすい場合もあるかと思います。
お好みで使分けてください。

再スタートするには?

Branchノードでは分岐後に合流して共通処理を行いたい場合は分岐先で意図的に合流させる必要がありました。

Ifノードでは条件分岐先の処理が完了するとCompletedポートの接続先に遷移しますので分岐処理完了後の共通処理が行えます。
Branchと同じく繰り返し再スタートする例を挙げると以下のようになります。

次回

次回は、For Intノードでループを行います。

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