Inspector で設定可能なカスタムイベント
独自のカスタムイベントを作成して、Inspector ウィンドウで永続化された (lasting between Edit mode and Play mode) コールバックを設定します。
読み終わるまでの所要時間 7 分最終更新 3日前
Unity は、標準の C# イベントとデリゲートに代わる Unity 固有の方法として UnityEvent API を提供しています。標準の C# イベントに対する Unity イベントの主な利点は、Unity イベントがシリアライズ可能である、つまり Inspector ウィンドウで設定できることです。
UnityEventMonoBehaviourUnityEventMonoBehaviourInspector
?
Unity イベントには、標準の C# デリゲートと同様の制限があります。
- ターゲットオブジェクトへの参照を保持し、ターゲットオブジェクトのガベージコレクションを停止します。
- マネージ (C#) をターゲットとし、アンマネージ (C++) の対応するオブジェクトが破棄されている場合、コールバックは実行されません。詳細については、 オブジェクト を参照してください。
UnityEngine.Object
Unity イベントの設定
前提条件
- を含む MonoBehaviour スクリプトの作成
using UnityEngine.Events - 型のフィールドを少なくとも 1 つ宣言する
UnityEvent
Inspector ウィンドウでコールバックを設定します。
-
宣言したフィールドを含むスクリプトコンポーネントを持つゲームオブジェクトを選択します。
UnityEvent -
コールバックのスロットを追加するには、イベント名の下の + ボタンをクリックします。
-
コールバックを受け取る UnityEngine.オブジェクトを選択します。オブジェクト セレクタを使用するか、オブジェクトをフィールドにドラッグアンドドロップできます。
-
イベントが発生したときに呼び出す機能を選択します。ドロップダウンセレクタには、ゲームオブジェクトとそのコンポーネントで使用可能な適切なメソッドのフィルタリングされたリストが表示されます。
-
必要に応じて手順 1 ~ 4 を繰り返し、同じイベントにコールバックを追加します。
Configuring callbacks for events called Trigger Entered and Trigger Exited in the Inspector window
静的および動的コール
Inspector ウィンドウでを設定する場合、次の 2 種類の機能呼び出しがサポートされます。
UnityEvent- 静的呼び出しは、オーサリング時にターゲットとパラメーターの値が Inspector ウィンドウで定義され、完全に事前設定されます。コールバックが発生すると、Inspector で定義されたパラメーター値を使用してターゲット機能が実行されます。これは、ランタイムに変動しない値に適しています。例えば、特定の衝突が発生するたびに、設定した量だけ体力値を減分したい場合などです。静的にバインドされた関数は、機能選択リストの静的パラメータの下に表示されます。
- 動的呼び出しは、コードから、呼び出されるの型に一致するパラメータを使用してプログラムで呼び出されます。これはランタイムで変化する値、例えばキャラクターが各攻撃で受けるダメージの変数量を表す
UnityEventに適しています。UI はコールバックをフィルタリングし、floatの種類に有効なシグネチャを持つ動的関数のみを表示します。例えば、UnityEventがある場合、機能セレクターは動的文字列ヘッダーの下にUnityEvent<string>パラメーターを受け取るすべての関数を表示します。string
Choosing between static or dynamic functions whose signatures match the event type in the Inspector window
UnityEvent のジェネリック サポート
デフォルトでは、内のは機能に動的にバインドされます。ただし、以下の例に示すように、最大 4 つのジェネリック型パラメータを持つを作成できます。
MonobehaviourUnityEventvoidUnityEventusing 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); } }}