📗
【Unity】Hierarchyにアイコンを表示しよう
はじめに
初めての方も、そうでない方もこんにちは!
現役ゲームプログラマーのたむぼーです。
自己紹介を載せているので、気になる方は見ていただければ嬉しいです!
今回は
UnityのHierarchyにアイコンを表示する方法
を紹介します
実際の画面
こちらが、実際の画面です。
処理全体
任意の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