前言
在Hierarchy上添加些标志,可以使用Unity的默认标志,也可以自定义图标。原理上还是编辑器的GUI编辑。
效果
黑色的是Unity的效果,红色是自定义图片。
资源路径是:
实现
using UnityEditor;
using UnityEngine;
public class HierarchyMask
{
private static bool m_Init = false;
private static GUIStyle m_UnityGUIStyle;
private static GUIStyle m_MyGUIStyle;
private static int m_Size = 16;
private static Rect m_RendererRect = new Rect(0, 0, m_Size, m_Size);
private static bool m_UnityToogle = false;
private static bool m_MyToogle = false;
[InitializeOnLoadMethod]
public static void OnInit()
{
EditorApplication.hierarchyWindowItemOnGUI += DrawHierarchyIcon;
}
private static void OnInitGUIStyle()
{
m_Init = true;
m_UnityGUIStyle = (GUIStyle) "IN LockButton";
m_MyGUIStyle = new GUIStyle();
m_MyGUIStyle.normal.background = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/HierarchyMask/Icon/Icon_1.png");
m_MyGUIStyle.onNormal.background = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/HierarchyMask/Icon/Icon_1.png");
m_MyGUIStyle.onActive.background = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/HierarchyMask/Icon/Icon_0.png");
m_MyGUIStyle.onHover.background = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/HierarchyMask/Icon/Icon_0.png");
}
private static void DrawHierarchyIcon(int instanceID, Rect selectionRect)
{
if (!m_Init)
{
OnInitGUIStyle();
}
if (EditorApplication.isPlaying)
{
return;
}
GameObject InstanceGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
if (InstanceGameObject == null)
{
return;
}
m_RendererRect.y = selectionRect.y;
m_RendererRect.x = selectionRect.x + selectionRect.width - m_Size * 2;
m_UnityToogle = GUI.Toggle(m_RendererRect, m_UnityToogle, GUIContent.none, m_UnityGUIStyle);
m_RendererRect.x = selectionRect.x + selectionRect.width - m_Size;
m_MyToogle = GUI.Toggle(m_RendererRect, m_MyToogle, GUIContent.none, m_MyGUIStyle);
}
}
扩展
1.标志只要是GUI的都能实现。包括文字,图片啥的。
2.GUIStyle是GUI渲染的数据类。normal是必须要设置的,除此之外按需设置。
测试环境 2018.2.0f2 2017.4.3f1