以下の内容はhttps://baba-s.hatenablog.com/entry/2019/12/05/170000より取得しました。


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




以上の内容はhttps://baba-s.hatenablog.com/entry/2019/12/05/170000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14