📗

【Unity】Hierarchyにアイコンを表示しよう

2024/03/10に公開

はじめに

初めての方も、そうでない方もこんにちは!
現役ゲームプログラマーのたむぼーです。
自己紹介を載せているので、気になる方は見ていただければ嬉しいです!

今回は
 UnityのHierarchyにアイコンを表示する方法
を紹介します

https://zenn.dev/tmb/articles/1072f8ea010299

実際の画面

こちらが、実際の画面です。

処理全体

任意のEditorフォルダに下記スクリプトを格納してください。

HierarchyIconViewSetting.cs
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEditor;

namespace Editor
{
#if UNITY_EDITOR
    public class HierarchyIconViewSetting
    {
        public const string MenuPath = "CustomEditor/EditorSettings/Enable HierarchyIconView";

        /// <summary>
        /// 有効状態の切り換え
        /// </summary>
        [MenuItem(MenuPath)]
        public static void ToggleEnable()
        {
            EditorSettingsHelper.ToggleEnable(ref HierarchyIconView.isEnable, HierarchyIconView.PrefKey);
        }

        /// <summary>
        /// メニューのチェック設定
        /// </summary>
        [MenuItem(MenuPath, true)]
        public static bool ToggleEnableValidate()
        {
            EditorSettingsHelper.SetMenuItemChecked(MenuPath, HierarchyIconView.isEnable);
            return true;
        }
    }

    [InitializeOnLoad]
    public class HierarchyIconView
    {
        /// <summary> 有効か </summary>
        static public bool isEnable = true;

        /// <summary> プレフキー </summary>
        static readonly public string PrefKey = "HierarchyIconView.isEnable";

        /// <summary> アイコンのサイズ </summary>
        private const int IconSize = 16;

        /// <summary> 描画する項目 </summary>
        static private System.Type[] _visibleTypes = {
                typeof(MonoBehaviour),
                typeof(Collider),
                typeof(Rigidbody),
                typeof(Renderer),
                typeof(Animator),
                typeof(ParticleSystem),
                typeof(Camera),
                typeof(Canvas),
                typeof(CanvasRenderer),
                typeof(Light),
                typeof(UIBehaviour),
                typeof(Graphic),
            };

        /// <summary>
        /// コンストラクタ
        /// </summary>
        static HierarchyIconView()
        {
            isEnable = EditorSettingsHelper.GetEnableState(PrefKey, isEnable);
            EditorApplication.hierarchyWindowItemOnGUI += ItemOnGUI;
        }

        /// <summary>
        /// ヒエラルキーにアイコンを描画
        /// </summary>
        static public void ItemOnGUI(int instanceID, Rect rect)
        {
            if (! isEnable)
            {
                return;
            }

            rect.x += rect.width;
            rect.width = IconSize;

            // インスタンスIDでオブジェクトを取得
            GameObject target = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
            if (target == null)
            {
                return;
            }

            // オブジェクトにアタッチされたすべてのコンポーネントを取得
            Component[] components = target.GetComponents<Component>();
            HashSet<Texture> textures = new HashSet<Texture>();

            // 各コンポーネントのタイプに基づいてアイコンを取得
            foreach (Component component in components)
            {
                if (component == null)
                {
                    continue;
                }
                foreach (System.Type visibleType in _visibleTypes)
                {
                    System.Type type = component.GetType();
                    if (type.IsSubclassOf(visibleType) || type == visibleType)
                    {
                        textures.Add(AssetPreview.GetMiniThumbnail(component));
                    }
                }
            }

            // アイコンを描画
            foreach (Texture texture in textures)
            {
                if (texture == null)
                {
                    continue;
                }
                rect.x -= IconSize;
                GUI.DrawTexture(rect, texture);
            }
        }
    }
#endif
}
EditorSettingsHelper.cs
using UnityEditor;

namespace Editor
{
#if UNITY_EDITOR
    static public class EditorSettingsHelper
    {
        /// <summary>
        /// 有効状態の切り換え
        /// </summary>
        static public void ToggleEnable(ref bool isEnable, string key)
        {
            isEnable = !isEnable;
            EditorPrefs.SetBool(key, isEnable);
        }

        /// <summary>
        /// 保存された状態を取得
        /// </summary>
        static public bool GetEnableState(string key, bool defaultValue)
        {
            return EditorPrefs.GetBool(key, defaultValue);
        }

        /// <summary>
        /// メニューのチェック設定
        /// </summary>
        static public void SetMenuItemChecked(string menuPath, bool isChecked)
        {
            Menu.SetChecked(menuPath, isChecked);
        }
    }
#endif
}

Discussion