カスタム Visual Script イベントノードの作成
Event ノードは、アクションを実行する入口です (例: OnStart、OnUpdate、OnButton)。別の Visual Script Graph にイベントを送信させたい場合は Event Sender ノードも作成する必要があります。
カスタムの Visual Scripting イベントの作成は、以下の手順で行えます。
- 単純なカスタムの Event Sender ノードを作成します。
- プログラミングによって (C# スクリプト内で) 単純なカスタムイベントをトリガーするスクリプトを作成します。
- カスタムイベントをリッスンするスクリプトを作成します。
単純なカスタムイベントノードを作成する
空のイベントノードの作成は、以下の手順で行えます。
プロジェクト内で右クリックし、Create > C# Script を選択して、イベントノードの名前を持つ新しい C# ファイル (例: MyEventNode.cs) をプロジェクト内に作成します。
以下のコードをコピーして、スクリプト内に貼り付けて保存します。
using Unity.VisualScripting; using UnityEngine; //カスタムイベントの文字列名を登録してそれをイベントにフックします。このクラスは別ファイルに保存でき、複数のイベントをパブリックな静的文字列として追加することができます。 public static class EventNames { public static string MyCustomEvent = "MyCustomEvent"; } [UnitTitle("On my Custom Event")]//イベントを受け取る Custom Event ノード。イベントの命名規則に従ってノードのタイトルに On を追加しています。 [UnitCategory("Events\\MyEvents")]//ファジーファインダー内でノードを特定するパスを Events > My Events に設定しています。 public class MyCustomEvent : EventUnit<int> { [DoNotSerialize]// ポートのシリアル化は不要です。 public ValueOutput result { get; private set; }// イベントがトリガーされた時に返される、イベントの出力データです。 protected override bool register => true; // EventHook をイベント名とともに Visual Scripting イベントのリストに追加します。 public override EventHook GetHook(GraphReference reference) { return new EventHook(EventNames.MyCustomEvent); } protected override void Definition() { base.Definition(); // ポートに値を設定します。 result = ValueOutput<int>(nameof(result)); } // ポートに値を設定します。 protected override void AssignArguments(Flow flow, int data) { flow.SetValue(result, data); } }
Edit > Project Settings を選択してください。 Project Settings ウィンドウが表示されます。
Project Settings ウィンドウで Visual Scripting を選択し、Regenerate Nodes を選択してファジーファインダーに新しいノードを追加します。
新しいイベントノードをグラフに追加するには、任意の Script Graph (スクリプトグラフ) の背景を右クリックしてください。 ファジーファインダーが表示されます。
Events > My Events > On my Custom Event を選択してください。
Script Graph ウィンドウが開きます。グラフが以下のように表示されます。
.
Event Sender ノードを作成する
ユーザーが別のグラフからイベントノードをトリガーできるようにするには、Event Sender ノードを作成する必要があります。このノードは、別のグラフからイベントを発信したり、別のグラフ内のイベントに値を渡すことができます。
また C# スクリプトからイベントをトリガーする ことも可能です。
プロジェクト内で右クリックし、Create > C# Script を選択して、イベントノードの名前を持つ新しい C# ファイル (例: SendMyEventNode.cs) をプロジェクト内に作成してください。
以下のコードをコピーして、スクリプト内に貼り付けて保存します。
using Unity.VisualScripting; //イベントを送信するカスタムノード [UnitTitle("Send My custom Event")] [UnitCategory("Events\\MyEvents")]//ファジーファインダーでノードを特定するパスを Events > My Events に設定します。 public class SendMyEvent : Unit { [DoNotSerialize]// シリアル化すべきでないデータをシリアル化しないようにするための必須の属性です。 [PortLabelHidden]// デフォルトの Input Trigger と Output Trigger のラベルは通常非表示にするので、ポートラベルを非表示にします。 public ControlInput inputTrigger { get; private set; } [DoNotSerialize] public ValueInput myValue; [DoNotSerialize] [PortLabelHidden]// デフォルトの Input Trigger と Output Trigger のラベルは通常非表示にするので、ポートラベルを非表示にします。 public ControlOutput outputTrigger { get; private set; } protected override void Definition() { inputTrigger = ControlInput(nameof(inputTrigger), Trigger); myValue = ValueInput<int>(nameof(myValue),1); outputTrigger = ControlOutput(nameof(outputTrigger)); Succession(inputTrigger, outputTrigger); } //イベント MyCustomEvent を ValueInput のポート myValueA からの int 値とともに送信します。 private ControlOutput Trigger(Flow flow) { EventBus.Trigger(EventNames.MyCustomEvent, flow.GetValue<int>(myValue)); return outputTrigger; } }
Edit > Project Settings を選択してください。
Project Settings ウィンドウが表示されます。
Project Settings ウィンドウで Visual Scripting を選択し、Regenerate Nodes を選択してファジーファインダーに新しいノードを追加します。
新しいノードをグラフ内に追加するには、任意の Script Graph の背景を右クリックして Events > My Events > Send My custom Event を選択してください。
ノート
Send My custom Event ノードと On my CustomEvent ノードをテストするには、以下のステップが両方完了している必要があります。
- 単純なカスタムイベントノードを作成する。
- Event Sender ノードを作成する。
上矢印キーでイベントを送信するゲームオブジェクトを追加する
上矢印キーでイベントを送信するゲームオブジェクトを追加するには、以下の手順に従ってください。
- Hierarchy ウィンドウで、空の ゲームオブジェクト を新規作成して EventSender と名付けてください。
- ScriptMachine コンポーネントを追加してください。
- Script Machine コンポーネントに、作成した新しい Script Graph を追加します。
- グラフを開きます。
- グラフの背景を右クリックしてファジーファインダーを開きます。
- ファジーファインダーで “On Keyboard Input” を検索します。
- グラフの背景を右クリックしてファジーファインダーを開きます。
- ファジーファインダーで “Send My custom Event” を検索します。
- 2 つのノードを接続してください。
例: キーボード入力を接続するには:
イベントを受け取ってコードを実行するゲームオブジェクトを追加する
イベントを受け取ってコードを実行するゲームオブジェクトを追加するには、以下の手順に従ってください。
- Hierarchy ウィンドウで、空の GameObject を新規作成して EventReceiver と名付けてください。
- ScriptMachine コンポーネントを追加してください。
- Script Machine コンポーネントに、作成した新しい Script Graph を追加します。
- グラフを開きます。
- グラフの背景を右クリックしてファジーファインダーを開きます。
- ファジーファインダーで “On my Custom Event” と検索します。
- グラフの背景を右クリックしてファジーファインダーを開きます。
- ファジーファインダーで “Debug Log” と検索します。
- 2 つのノードを接続してください。
例: イベントを受け取ってコンソールに Event Value と書き込むには:
上記のステップが完了したら、以下を行ってください。
- 設定をテストします。再生ボタンを押してゲームを開始します。
- スペースキーを押して放します。
- Unity コンソールに、アクションを確認するメッセージが表示されます。
コードからイベントをトリガーする
C# コードからイベントを送信することもできます。以下の例には、CodeTriggerCustomEvent というコンポーネントスクリプトが含まれており、これが、任意のキー (下矢印) が押された時にイベントをトリガーします。
using Unity.VisualScripting;
using UnityEngine;
public class CodeTriggerCustomEvent : MonoBehaviour
{
void Update()
{
if (Input.anyKeyDown)
{
//上記で作成された (整数値 2 を持つ) カスタムイベント MyCustomEvent をトリガーします。
EventBus.Trigger(EventNames.MyCustomEvent, 2);
}
}
}
作成されたスクリプトをシーン内の任意のゲームオブジェクトに追加してください。
再生ボタンを押し、続いて任意のキーを押してください。シーン内の、上記で作成したイベントを含む Script Graph 内で、イベントがトリガーされます。
コードからイベントをリッスンする
Visual Scripting からトリガーされたイベントを C# スクリプト内で受け取るには、以下の手順に従ってください。
プロジェクト内を右クリックし、Create > C# Script を選択して、イベントノードの名前を持つ新しい C# ファイル (例: EventReceiver.cs) をプロジェクト内に作成してください。
以下のコードをコピーして、スクリプト内に貼り付けて保存します。
public class EventReceiver : MonoBehaviour { void Start() { EventBus.Register<int>(EventNames.MyCrazyCustomEvent, i => { Debug.Log("RECEIVED " + i); }); } }
現在のシーンの Hierarchy ウィンドウ内でゲームオブジェクトを選択してください。
Inspector で Add Component を選択し、EventReceiver を選択します。
シーン内に Event Sender がある場合は、再生モードを開始してイベントをトリガーしてください。
Unity コンソールに “RECEIVED” というメッセージが表示され、その後に数字 (i) が表示されます。