うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Hierarchy Window を拡張する

Hierarchy Window を拡張するには EditorApplication.hierarchyWindowItemOnGUI を利用する

拡張処理を記述しないで、最低限の処理のみだと以下のコードになる

using UnityEditor;
using UnityEngine;

public class HierarchyExtension
{
    [InitializeOnLoadMethod]
    private static void Initialize()
    {
        EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI;
    }
 
    private static void HierarchyWindowItemOnGUI(int instanceId, Rect selectionRect)
    {
        // 描画処理を記述
    }
}

GameObject のコンポーネント一覧を表示するように拡張した例

f:id:hacchi_man:20200119230236p:plain:w400

using UnityEditor;
using UnityEngine;
 
public class HierarchyExtension
{
    [InitializeOnLoadMethod]
    private static void Initialize()
    {
        EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI;
    }
 
    private const int IconSize = 15;
     
    private static void HierarchyWindowItemOnGUI(int instanceId, Rect selectionRect)
    {
        // GameObject が取得できない場合は SceneAsset
        var obj = EditorUtility.InstanceIDToObject(instanceId) as GameObject;
        if (obj == null)
            return;
         
        // 所持しているコンポーネント一覧を取得
        var components = obj.GetComponents<Component>();
        if (components.Length <= 0)
            return;
         
        // 表示数分 x の位置を変更
        selectionRect.x = selectionRect.width - IconSize * components.Length;
        selectionRect.width = IconSize;
        foreach (var component in components)
        {
            // コンポーネントのアイコン画像を取得
            var texture2D = AssetPreview.GetMiniThumbnail(component);
            
            GUI.DrawTexture(selectionRect, texture2D);
            selectionRect.x += IconSize;
        }
    }
}