こんにちは、Unityエンジニアのオオバです。
Unity2021からデフォルトでインストールされている「Visual Scripting(旧:Bolt)」。ノードをつなげてプログラミングできるツールです。
本記事では 「C#スクリプトからVisual Scriptingで作ったScript Graph(スクリプトグラフ)の処理を呼び出す方法」 を解説します。Visual Scriptingを使い出すとどうしても機能同士をつなげる処理が必要になります。例えば「ボタンを押したらウィンドウを開く」といった内容です。
今回紹介する内容は、各機能を連結させるために必要になるテクニックなのでぜひ最後まで読んでみてください。
Visual Scriptingの始め方や基礎はこちらの記事にまとめていますので、ぜひ読んでみてください。
CustomEventを定義してC#スクリプトから呼び出す
はじめに結論を簡単にまとめます。
①Script Graph内にCustomEventユニットを作成
②Custom Eventユニット内にイベント名を定義
③スクリプトからイベント名をキーにして呼び出す
Visual Scriptingには CustomEvent という形で 外部からの呼び出しに対応 しています。この機能を使えばグラフの外側から処理を呼び出すことが可能です。
以降の章で詳しく解説していきます。
逆にVisual ScriptingからC#スクリプトを呼び出す方法は次の記事で詳しく解説していますのであわせて読んでみてください。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
Visual Scriptingの準備
C#スクリプトからVisual Scriptingを呼び出す方法を解説する前に、今回使用するVisual Scriptingの準備をします。
Script Graphの作成
まずはVisual Scriptingするためのグラフを作成します。State Graph(ステートグラフ)、Script Graph(スクリプトグラフ)と2種類ありますが、今回はScript Graphを使います。
メニューAssets > Create > Visual Scripting > Script Graph
をクリックしましょう。 Projectウィンドウ内にScript Graphアセットが作られるので「TestGraph」と名付けました。
グラフは大量に増えてしまうため、あらかじめ「Graph」というフォルダに入れています。ちなみに本記事ではグラフは1つしか使用しません。
Script GraphをGameObjectにセット
作成したScript GraphをGameObjectに関連付けます。しかしScript Graphはコンポーネントではないため、GameObjectにそのままAddComponentできないのです。
👉 【保存版】Unityのコンポーネント徹底解説【Unity基礎】
そこで 「Script Machine(スクリプトマシン)コンポーネント」 を使用します。
①Hierarchyウィンドウに1つ空のGameObject(TestMachineと命名)を作成して、②Script Machineコンポーネントをセットします。
①のGraphに「Script Graphの作成」で作成したTestGraphアセットをセットしてください。これでGameObjectとグラフを関連付けることができました。
では、ここからグラフの編集に入るため②の Edit Graphボタン をクリックしてください。
Visual ScriptingをC#スクリプトから呼び出す3つの手順
Visual ScriptingをC#スクリプトから呼び出す方法を3つの手順で紹介します。
①Script Graph内にCustom Eventユニットの作成
②Custom Eventユニットにイベント名を定義
③C#スクリプトからCustom Eventを呼び出す
手順①Script Graph内にCustom Eventユニットの作成
Script Graphの中にCustom Eventユニットを作成します。何も表示されていないScript Graphウィンドウ内で右クリックしましょう。
検索窓に「Custom Event」と入力していくとCustom Eventユニットがヒットしますので選択します。
するとこんな感じでCustom Eventユニットが作成されます。
手順②Custom Eventユニットにイベント名を定義
次にCustom EventをC#から呼び出せるようにイベント名を設定していきます。
作成したCustom Eventユニットに C#から呼び出すためのイベント名を設定します。 今回は「TestEvent」にしました。以上でイベント名の定義は終了です。
このままではC#からグラフがいつ呼ばれたのかわからないので、 Custom Eventユニットが呼ばれたときにログを出力 してみましょう。
Custom Eventユニットの出力先からDebug Logユニットを接続します。
しかし、このままでは出力する文字列がありません(設定されていないから)。
そこで、C#スクリプトからCustom Eventを呼び出す際に文字列を渡してログ出力するように実装してみます。
Custom Eventユニットに引数を追加(最大10個)
Custom Eventユニットの「Arguments」は、最初「0」になっていますが「1」に修正します。 ArgumentsとはCustom Eventを実行する際の引数の個数 を表します。
このように「Arg. 0」という出力が追加されました。
「Arg. 0」にはログ出力する文字列が格納されるので、Debug LogユニットのMessageに接続します。
ちなみにCustom Eventの引数は最大10個まで渡すことができます。
10個も使うことはないと思いますが、引数の数に最大値が存在することを一応覚えておきましょう。
手順③C#スクリプトからCustom Eventを呼び出す
最後にC#スクリプトからScript Graphを呼び出します。結論から話すと CustomEvent.Trigger
メソッドを使います。引数には以下の3つを設定します。
- 呼び出したいScript MachineコンポーネントのGameObject
- イベント名
- Custom Eventの引数
👉 【Unity基礎】GameObjectの使い方(生成や削除など)全て解説
準備としてMonoBehaviourを継承したC#スクリプトを作成(CallScriptToGraph.csと命名)します。
Script Machineと同じGameObjectにAddComponentしましょう。
👉 【Unityの基礎】MonoBehaviour徹底解説【初心者向け】
CallScriptToGraph.csを以下のように修正してください。
using Unity.VisualScripting;
using UnityEngine;
public class CallScriptToGraph : MonoBehaviour
{
void Awake()
{
CustomEvent.Trigger(gameObject, "TestEvent", "ScriptToGraph");
}
}
CustomEvent.Triggerメソッドを使うことでScript Graph内のCustom Eventを呼び出せます。
Awakeメソッドに実装したため、Unity実行直後にCustomEvent.Triggerは呼び出されます。ログ出力させる文字列は「ScriptToGraph」と指定しました。Consoleウィンドウにこの文字列が表示されたら成功です。
ではUnityを実行してみます。
すると「ScriptToGraph」という文字列がConsoleウィンドウに表示されました。成功です。
このようにCustom Eventユニットを使うことでC#スクリプトからグラフの処理を呼び出すことができるのです。
まとめ
本記事ではC#スクリプトからVisual ScriptingのScript Graphを呼び出す方法を紹介しました。簡単に内容をまとめます。
①Custom Eventユニットを作成
②Custom Eventユニットにイベント名を設定
③CustomEvent.TriggerメソッドでCustom Eventユニットを呼び出す
こんな感じです。C#からグラフへのアクセスは仕組みがわかればとても簡単です。1つのグラフ内にいくつもCustom Eventユニットは作成できるので、C#スクリプト内にpublicメソッドを定義する感覚と似ています。
しかし、 イベント名が文字列指定のためタイプミスを防ぐ工夫が今後必要になりそう だなという印象です。
本記事ではC#スクリプトからVisual Scriptingへのアクセス方法の解説でしたが、逆にVisual ScriptingからC#スクリプトを呼び出す方法は次の記事で詳しく解説していますのであわせて読んでみてください。
この記事があなたのゲーム開発に少しでもお役に立てたら嬉しいです。
この記事が気に入ったらフォローしよう
「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!
最後まで読んでいただきありがとうございました!
すばらしいVisual Scriptingライフをお過ごしください。
- Unity2021.3.0f1
- Visual Scripting v1.7.8