本日は Unity の小ネタ枠です。
UnityEventの永続リスナーと非永続リスナーの違いについて理解できていなかったので記事にします。
UnityEvent
Scene に保存可能なコールバック関数を登録します。
docs.unity3d.com
UnityEvent へのコールバック関数の登録は Inspector ビューから行う方法と AddListener を用いる方法があります。
UnityEvent m_MyEvent = new UnityEvent(); void Start() { // イベントへのリスナー登録 m_MyEvent.AddListener(MyAction); }
永続的リスナーと非永続的リスナー
UnityEvent に登録されるリスナーには永続的リスナーと非永続的リスナーの2種類のリスナーが存在します。
Inspector ビューは永続的リスナーを、AddListener は非永続的リスナーを登録します。
サンプルスクリプト
動作を実際に確認するため、以下のサンプルスクリプトを作成しました。
・CheckUnityEvent.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class CheckUnityEvent : MonoBehaviour { /// <summary> /// テスト用UnityEvent /// </summary> public UnityEvent TestEvent; /// <summary> /// UnityEventの実行 /// </summary> public void InvokeEvent() { // 登録リスナーを呼び出す TestEvent.Invoke(); } /// <summary> /// 登録リスナー数の確認 /// </summary> public void CheckAddListenerCount() { Debug.Log("Listener Count : " + TestEvent.GetPersistentEventCount().ToString()); } /// <summary> /// スクリプトからのリスナー登録 /// </summary> public void TestAddListener() { Debug.Log("TestAddListener Called !!!"); TestEvent.AddListener(TestCallMethod); } /// <summary> /// 試験用呼び出しメソッド /// </summary> public void TestCallMethod() { Debug.Log("TestCallMethod Called !!!"); } }
永続的リスナー
Inspector ビューから登録したリスナーは永続的リスナーになります。
登録済みの永続的リスナーは Inspector 上から確認できます。
永続的リスナーはその登録数を GetPersistentEventCount 関数で取得できます。
Invoke で関数呼び出しを実行します。