コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】エディタ拡張でイベントの登録前に解除する必要があるのかどうか

はじめに

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つでした(多重登録はされていなかった)
なので、イベントの登録前に解除する必要はなさそう?