using UnityEditor;
using UnityEngine;
public class ShowSortingOrderInHierarchy
{
const string editorMenuPath = "Tools/Show SortingOrder In Hierarchy";
static bool isShowSortingOrder = false;
//priority > 10 ? 菜单将会显示在Hierarchy中
[MenuItem(editorMenuPath)]
static void ShowSortingOrder()
{
isShowSortingOrder = !isShowSortingOrder;
EditorApplication.hierarchyWindowItemOnGUI -= HierarchyItemCb2ShowSortingOrder;
if (isShowSortingOrder)
EditorApplication.hierarchyWindowItemOnGUI += HierarchyItemCb2ShowSortingOrder;
//设置菜单勾选状态,注意在Hierarchy中是无法显示勾选状态
Menu.SetChecked(editorMenuPath, isShowSortingOrder);
}
/// <summary>
/// 显示菜单的时候同步一下 isShowSortingOrder, 否则Editor运行后状态对应不上
/// </summary>
[MenuItem(editorMenuPath, true)]
static bool ShowSortingOrderCheck()
{
Menu.SetChecked(editorMenuPath, isShowSortingOrder);
return true;
}
private static void HierarchyItemCb2ShowSortingOrder(int instanceID, Rect selectionRect)
{
var obj = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
if (obj == null)
return;
var renderer = obj.GetComponent<Renderer>();
if (renderer != null)
{
ShowGUILable(selectionRect, renderer.sortingOrder.ToString());
return;
}
if (obj.GetComponent<RectTransform>() != null)
{
var canvas = GetComponentInParentRecursive<Canvas>(obj);
if (canvas != null)
ShowGUILable(selectionRect, canvas.sortingOrder.ToString());
}
}
/// <summary>
/// 递归获取自己或者父级节点控件
/// </summary>
/// <typeparam name="T">控件类型</typeparam>
/// <param name="go">当前节点</param>
/// <returns></returns>
static T GetComponentInParentRecursive<T>(GameObject go) where T : Component
{
var com = go.GetComponent<T>();
//Tips:不加泛型约束where T : Component会导致null比较失败
if (com != null)
return com;
var parent = go.transform.parent;
if (parent)
return GetComponentInParentRecursive<T>(parent.gameObject);
return default;
}
static void ShowGUILable(Rect selectRect, string lableText)
{
Rect temp = new Rect(selectRect);
//一个数字宽度是5,偏移30能显示6个数字
temp.x = selectRect.xMax - 30;
//红色文本显示
var style = new GUIStyle();
style.normal.textColor = Color.red;
GUI.Label(temp, lableText, style);
}
}