【Unity】Hierarchy Windowで表示される特定のGameObjectの見た目を変更する

特定のComponentを持つGameObjectを視覚的にわかりやすくしたいという要望があり、少しやり方を調べてみました。

例コード

UnityエディタのHierarchyウィンドウで表示されるゲームオブジェクトの色を変更するクラスです。 特定のコンポーネントが存在する場合、そのゲームオブジェクトの色を変更します。 例として、Imageコンポーネントが存在する場合には色を変える場合のコードが次になります。

#if UNITY_EDITOR

using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

[InitializeOnLoad]
public class HierarchyColor
{
    static HierarchyColor()
    {
        EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI;
    }

    private static void HierarchyWindowItemOnGUI(int instanceID, Rect selectionRect)
    {
        var gameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
        if (gameObject != null && gameObject.GetComponent<Image>() != null)
        {
            EditorGUI.DrawRect(selectionRect, Color.red);
            GUI.color = Color.black;
            EditorGUI.LabelField(selectionRect, gameObject.name,new GUIStyle()
            {
                fontStyle = FontStyle.Bold
            });
            GUI.color = Color.white;
        }
    }
}
#endif

InitializeOnLoad

エディタがロードされたときに一度だけ呼び出されます docs.unity3d.com

EditorApplication.hierarchyWindowItemOnGUI

Hierarchyウィンドウで各ゲームオブジェクトが描画されるたびに、特定のイベントが発生します。 このイベントのハンドラは、ゲームオブジェクトのインスタンスIDと描画領域のRectを引数として受け取ります。これらの情報を利用してハンドラ内でゲームオブジェクトの描画方法をカスタマイズすることが可能です。

docs.unity3d.com

EditorUtility.InstanceIDToObject

引数として与えられたインスタンスIDを使用して、そのIDに関連付けられたオブジェクトを取得します。

設定画像