Unity は、標準の C# イベントとデリゲート に代わる Unity 固有の方法として UnityEvent API を提供しています。標準の C# イベントに対する Unity イベントの主な利点は、Unity イベントがシリアル化可能である、つまり Inspector ウィンドウ で設定できることです。
UnityEvent は任意の MonoBehaviour に追加でき、標準の C# デリゲートのようにランタイムに実行されます。UnityEvent が MonoBehaviour で宣言されると Inspector ウィンドウに表示され、編集時からランタイムまで存続するコールバックを定義できます。
UnityEvent には、標準の C# デリゲートと同様の制限があります。
UnityEngine.Object をターゲットとし、アンマネージ (C++) の対応するオブジェクトが破棄されている場合、コールバックは実行されません。詳細は、Null 参照 を参照してください。using UnityEngine.Events を含む MonoBehaviour スクリプトの作成UnityEvent 型フィールドの宣言宣言した UnityEvent フィールドを含むスクリプトコンポーネントを持つゲームオブジェクトを選択します。
コールバックのスロットを追加するには、イベント名の下の + ボタンをクリックします。
コールバックを受け取る UnityEngine.Object を選択します。オブジェクトセレクターを使用するか、オブジェクトをフィールドにドラッグアンドドロップして選択できます。
イベントが発生したときに呼び出す関数を選択します。ドロップダウンセレクターには、ゲームオブジェクトとそのコンポーネントで使用できる 適切なメソッド をフィルタリングしたリストが表示されます。
必要に応じて 1 から 4 のステップを繰り返し、同じイベントにコールバックを追加します。
Inspector ウィンドウから UnityEvent を設定する場合、サポートされる関数には 2 つの種類があります。
UnityEvent の型に一致するパラメーターを使用します。これはランタイムで変化する値、例えばキャラクターが各攻撃で受けるダメージの変数量を表す float などに適しています。UI はコールバックにフィルターをかけ、UnityEvent の型で有効なシグネチャを持つ動的関数のみを表示します。例えば、UnityEvent<string> がある場合、関数セレクターは Dynamic string ヘッダーの下に string パラメーターを受け取るすべての関数を表示します。
デフォルトでは、Monobehaviour 内の UnityEvent は void 関数に動的にバインドされます。ただし、以下の例に示すように、最大 4 つのジェネリック型パラメーターを持つ UnityEvent を作成できます。
using UnityEngine;
using UnityEngine.Events;
public class GenericTest : MonoBehaviour
{
public UnityEvent<int, int, bool, string> myEvent;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
if (myEvent == null)
{
myEvent = new UnityEvent<int, int, bool, string>();
}
myEvent.AddListener(Ping);
}
// Update is called once per frame
void Update()
{
if (Input.anyKeyDown && myEvent != null)
{
myEvent.Invoke(5, 6, true, "Hello");
}
}
void Ping(int i, int j, bool print, string text)
{
if (print)
{
Debug.Log("Ping: " + text + i + j);
}
}
}