【Unity】VisualScripting Events unit について 1

はじめに

  • 画像をクリックしたときに反応する
  • ある文字列の通知が投げられたら反応する
  • 開始時に一度だけ呼び出される (Start)
  • 毎フレーム呼び出される (Update)

などなど
VisualScriptingにはいくつものイベントが存在しており Events unit と呼ばれるそれらの紹介をしていこうと思います

f:id:toshizabeth:20210924094254p:plain

※ 以下の公式リファレンスを参照します

Events unit | Visual Scripting | 1.7.3

イベントユニットは緑色で表示される

Lifecycle

Events > Lifecycle

f:id:toshizabeth:20210924095416p:plain

グラフにおいて最初に起動される。
ライフサイクルイベントはUnityのMonobehaviourにある Start, Update, OnEnable などを再現している

f:id:toshizabeth:20210925235851j:plain

※ Monobehaviourの挙動と同じなため簡潔に説明します

OnStart

グラフが起動した瞬間に一度だけ呼び出されるユニット

OnUpdate

GameObejctがアクティブな状態の時、毎フレーム呼び出される

OnFixedUpdate

0.02秒ごとに一度呼び出されるUpdate(一秒に50回)
つまり特定の期間に一度呼び出されるUpdate

OnLateUpdate

すべてのUpdate, OnFixedUpdate処理の後に走るUpdate

OnEnable

オブジェクトがアクティブ化されるたびに呼び出される

OnDisable

オブジェクトが非アクティブ化されるたびに呼び出される

OnDestroy

オブジェクトが削除されたときに呼び出される


挙動を確認するには以下のように単純なログ出力を組むとわかりやすいと思います

f:id:toshizabeth:20210926160557p:plain

f:id:toshizabeth:20210926160639g:plain

Inputs & Outputs

  • ボタンが押された時
  • マウスがクリックされた時
  • 通知された時

何らかのトリガーがあった時に開始するユニット群

キーボードで特定の入力があった時

Events > Input > OnKeybordInput

f:id:toshizabeth:20210926163025p:plain

※ マウスの入力も同じ

UGUIのボタンが押された時

画面上に配置したボタンが押された時に反応するようにします

f:id:toshizabeth:20210926164308p:plain

Events > GUI > Button Click

ボタンに Script Machine を取り付けている場合は Button Click ユニットそのままでいいですが
ボタンと違うオブジェクトのScriptMachineが押されたことを検知したい場合は、ボタンを参照するために SceneVariables に登録をします

f:id:toshizabeth:20210926164517p:plain

※ Type は GameObjectでもButtonでも大丈夫です

これでScene全体からこのUGUIボタンが参照できるようになったので
以下画像のように Get Variables で TestButtonを参照し OnButtonClickユニットと結びつけます

f:id:toshizabeth:20210926164700p:plain

UGUI内部にはその他UI変化があった時にトリガーされるユニットが用意されているので見ておくと良さげです

f:id:toshizabeth:20210926165024p:plain

Custom Events

個人的にイベントの中で最も重要だと思うのがCustomEvents
(よく使いそうなため)

あるグラフから別のグラフに対して

「プレイヤーがダメージを受けた」
「スキルを使用した」
などのユーザーがカスタムした通知を送りたい時に使用できる


ユニットの説明

Trigger Custom Event → イベントを送るユニット
Custom Event → イベントを受け取るユニット

f:id:toshizabeth:20210926173947p:plain

Trigger Custom Event ユニットで特定の名前のイベントを通知して、Custom Event ユニットで名前を指定したイベントを受け取る。


今回はボタンにScriptMachineを付けて、

f:id:toshizabeth:20210926190921p:plain

  1. ボタンが押された時に"TestButtonClick"というCustomEventを投げる。
  2. この時 "文字列" と "数値" をセットに送る
  3. 別のScriptMachineで "TestButtonClick" イベントを受け取って 文字列と数値 をログに出す

処理をしてみようと思います

まず、UGUIのボタンにScriptMachineを付けて中で OnButtonClickTrigger Custom Event を結びつけます
今回は Button コンポーネントに ScriptMachine を付けたので Get Variable する必要はありません。

f:id:toshizabeth:20210926180348p:plain

イベント名は "TestButtonClick" とします

文字列と数値を送るために、Trigger Custom Event ユニットの Arguments を 2 に変更し
string と integer ユニットを配置して結びつけます (Arg0, Arg1)

これでボタンが押された時にイベントが投げられるようになりました

Trigger Custom Event にはイベントを受け取る側のオブジェクトを付けることができます
今回は別のScriptMachineにイベントを送りたいため、対象のオブジェクトを Scene に登録して

f:id:toshizabeth:20210926190001p:plain

Get Variable ユニットでつなげます

f:id:toshizabeth:20210926190428p:plain


次にイベントを受け取る方を実装します

イベントを受け取るGameObjectにScriptMachineを付けて以下画像のように組み立てます

f:id:toshizabeth:20210926190215p:plain

Custom Event で TestButtonClick 名のイベントを受け取るようにして
Arg0, 1 を String.Concat ユニットで連結したものをログで出力します


結果

ボタン押した時にイベントの送受信が確認できます

f:id:toshizabeth:20210926190616g:plain

f:id:toshizabeth:20210926190635g:plain