はじめに
using UnityEditor; using UnityEngine; [InitializeOnLoad] public static class Example { static Example() { EditorApplication.hierarchyWindowItemOnGUI -= OnGUI; // ★ EditorApplication.hierarchyWindowItemOnGUI += OnGUI; } private static void OnGUI( int instanceId, Rect selectionRect ) { } }
上記のように InitializeOnLoad でイベントを登録する際に、
イベント登録前に解除しているソースコードを見かけたので
登録前に解除する必要があるのか気になって調べました
検証
using System; using UnityEditor; using UnityEngine; [InitializeOnLoad] public static class Example { static Example() { EditorApplication.hierarchyWindowItemOnGUI += OnGUI; var length = EditorApplication.hierarchyWindowItemOnGUI.GetLength(); Debug.Log( "登録数:" + length ); } private static void OnGUI( int instanceId, Rect selectionRect ) { } } public static class MulticastDelegateExtensions { public static int GetLength( this MulticastDelegate self ) { if ( self == null || self.GetInvocationList() == null ) { return 0; } return self.GetInvocationList().Length; } }
上記のようなコードを作成して、
- 何回か Unity を再生する
- 何回かコンパイルする
を試してみたところ、登録数は常に1つでした(多重登録はされていなかった)
なので、イベントの登録前に解除する必要はなさそう?