メンバーアクセスで乱数取得

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

今回はメンバーアクセスを使用して乱数値を取得してみましょう。
内容は以下の通りです。

  • Logic Behaviorコンポーネントの付いたGameObjectを作成する。
  • Logic Editorウィンドウでグラフを開いて編集する。
  • メンバーアクセス機能でRandom.valueの値を取得する。

シーンを新規作成

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

  • メニューから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選択と連動してグラフが切り替わるようになります。

Random.valueのComputeノードを作成

メンバーアクセス機能を使用してRandom.valueを取得するノードを作成します。

  • Startノードの下付近のグラフビューの何もないところを右クリック
  • メニューからCreate Nodeを選択し、ノード作成メニューを開く
  • Memberタブを選択
  • 検索バーにRandom.valueと入力
  • 一覧からUnityEngine.Randomvalueを選択
  • ノードの種類選択メニューからComputeを選択
  • コンパイルが終わるのを待つ
  • ノード名はそのままEnterキーで確定

ComputeノードとActionComponentについて

作成したComputeノードとActionComponentについて説明します。

Computeノードは何かしらの処理を行って結果の値を出力するノードです。
Actionノードなどの入力ポートに結果を出力することで、処理結果を使用して条件分岐などが行えます。
どのような処理を行うかはActionComponentというノード用コンポーネントに定義されています。

今回は、UnityEngine.Random型のvalueプロパティにアクセスした結果を返すActionComponentをメンバーアクセス機能で作成して使用しています。

ActionノードでもActionComponentを使用していたことを覚えていますでしょうか。
Logic Toolkitでは、ノードにはどのように処理を呼び出すかを定義し、ノード用コンポーネントにはどのような処理を行うかを定義することで、他のノードの種類でも同じ処理内容のノードコンポーネントを使いまわせる仕組みになっています。
Computeノードでは、値の出力が行われるActionComponentを使用することができ、出力先のノードで値が必要になった際に処理が行われます。
Actionノードでは、値の出力が行われるかにかかわらずどのActionComponentも使用でき、実行ポートからの接続によって遷移した時のみ処理が行われます。
状況により使い分けてください。

メンバーアクセス機能について

ほとんどのC#メンバー(UnityのAPIやユーザー定義のスクリプト)はメンバーアクセス機能によりグラフからも使用できます。
アクセスしたいメンバーを選択すると、自動的にメンバーアクセスを行うノード用コンポーネントのスクリプトを自動生成し、ノードに使用できるようになります。

今回は、UnityEngine.Random型のvalueプロパティにアクセスし結果を出力するActionComponentを作成しました。

Random.valueは、0.0fから1.0fまでの間のfloat値をランダムに返すプロパティです。

参考までに、生成されるスクリプトは以下のようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#pragma warning disable 0612
#pragma warning disable 0618

namespace LogicToolkit.GeneratedScripts
{
    [System.Serializable]
    [ScriptGenerated("Assets/Logic Toolkit/Generated Scripts/LogicToolkitGeneratedScripts/LogicToolkitGeneratedScripts.LogicToolkit_ScriptGenerator.additionalfile", 0)]
    [MenuName("/LogicToolkitGeneratedScripts/UnityEngine/Random/Get Random.value")]
    [MemberIconAttribute(MemberIconKind.StaticProperty)]
    [DefaultRecomputeMode(RecomputeMode.Node)]
    internal sealed class Generated_Get_UnityEngineːRandomːvalue : ActionComponent
    {
        [SerializeField]
        private OutputDataPort<float> _value = new OutputDataPort<float>();

        protected override void OnAction()
        {
            _value.SetValue(global::UnityEngine.Random.value);
        }
    }
}

一度作成されると、同じメンバーにアクセスする際には同じスクリプトが使用されるようになります。

ソースコードはIncremental Source Generatorによって内部的に自動生成されます。
(Assetsフォルダ下などにソースファイルは保存されません)
生成されたコードの内容はLogic Toolkitのバージョンによって異なる可能性があります。

ここでは生成されたスクリプトの詳細な解説は行いません。
このようなコードを内部的に生成していることを覚えていただければ大丈夫です。

自動生成時のコンパイル時間が気になる方もいるかと思いますが、スクリプトを記述する作業もなく次回以降のアクセスではコンパイルが発生しないため、結果的に作業時間は短縮されていきます。

Debug.LogのActionノードを作成

Debug.LogのActionノードで取得した乱数値を確認してみましょう。

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

ポートを接続

Random.valueの値をConsoleに出力するために、Debug.LogとRandom.valueを接続しましょう。

  • Get Random.valueのValueポートをドラッグ
  • Debug.LogのMessageポートにドロップ

データワイヤーについて

Get Random.valueのValueポートとDebug.LogのMessageポートデータワイヤーによって接続されています。
(ポート間に作成されたノードについては後述します)
このデータワイヤーは出力側のポートから入力側のポートに値を受け渡すためのワイヤー(接続線)です。

今回の場合は、Random.valueで取得した乱数値をDebug.LogのMessageに受け渡しています。

Convertノードについて

接続すると自動的に間に作成されるノードはConvertノードと言い、異なる型同士の値を接続した際に自動的に変換するノードです。

今回はRandom.valueのfloat型をMessageのstring型に変換するためにToStringノードが使用されています。

プレイして確認

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

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

  • Consoleウィンドウに0.0から1.0までの間の数値が表示されることを確認。
  • 何回かプレイモードを切り替えてConsoleウィンドウに表示される数値が変わることを確認。

Consoleウィンドウが表示されていない場合は、メニューからWindow > General > Consoleを選択して表示してください。
上記スクリーンショットのようにプレイ開始時にConsoleの内容をクリアしたくない場合は、Clearの▼ボタンをクリックし、メニューのClear on Playをオフにしてください。

シーンを保存

ここまでの内容を次回でも使用しますのでシーンを保存しておいてください。

  • Ctrl S(Win)、⌘ S(Mac)、あるいはメニューからFile > Saveを選択
  • Assetsフォルダを選択
  • MemberAccessという名前で保存。

次回

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

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