寫在前面
之前做的項(xiàng)目都是用的ugui,但是現(xiàn)在這個(gè)公司用的ngui,ngui有一個(gè)很不符合編輯邏輯的東西,就是層次,這個(gè)很符合程序員思維的層次模型概念,個(gè)人感覺一點(diǎn)都不好用。很容易搞混,寫了一個(gè)小工具來顯示UI的層次,這樣可以小小的彌補(bǔ)一點(diǎn)這個(gè)痛點(diǎn)吧。


基本原理
InitializeOnLoad
這個(gè)是一個(gè)Attribute,他可以在使你的類中的靜態(tài)構(gòu)造方法在編輯程序被加載時(shí)調(diào)用。
using UnityEngine;
using UnityEditor;
[InitializeOnLoad]
public class Startup {
static Startup()
{
Debug.Log("Up and running");
}
}
** EditorApplication.hierarchyWindowItemOnGUI**
這個(gè)是一個(gè)hierarchy面板繪制gui的一個(gè)回調(diào),這個(gè)回調(diào)有兩個(gè)參數(shù)一個(gè)是物體的instanceID另一個(gè)是hierarchy每一個(gè)rect。這里的rect的用法就是后面計(jì)算你所要顯示的物件的位置,他代表著hierarchy那一項(xiàng)的rect。EditorApplication這個(gè)還有很多接口配合著InitializeOnLoad使用相當(dāng)?shù)姆奖恪?/p>
EditorUtility.InstanceIDToObject(instanceid)
這個(gè)是根據(jù)instanceid獲得hierarchy中的object。具體用法:
var go = EditorUtility.InstanceIDToObject(instanceid) as GameObject;
if (go == null)
return;
這里感覺是一直迭代轉(zhuǎn)換成object,換句話說就是instanceid是固定的,早以前就有的,如果這里不判斷為null,就會(huì)報(bào)錯(cuò)。
基本原理就差不多這么多,后面就是操作那個(gè)gammeobject和那個(gè)位置了。具體的就不說了。我還加了顯示tag和layer以及控制物體active的按鍵。具體還可以自己自定義。下面是具體的實(shí)現(xiàn)代碼。
using UnityEditor;
using UnityEngine;
[InitializeOnLoad]
internal class MyClass
{
private static ShowHierarchyType mType = ShowHierarchyType.None;
static MyClass()
{
EditorApplication.hierarchyWindowItemOnGUI += HierarchyShowTips;
}
[MenuItem("GameObject/Hierarchy Tips/None", false, 0)]
private static void ShowNone()
{
mType = ShowHierarchyType.None;
}
[MenuItem("GameObject/Hierarchy Tips/Show Tag", false, 1)]
private static void ShowTag()
{
mType = ShowHierarchyType.Tag;
}
[MenuItem("GameObject/Hierarchy Tips/Show Layer", false, 2)]
private static void ShowLayer()
{
mType = ShowHierarchyType.Layer;
}
[MenuItem("GameObject/Hierarchy Tips/Show NGUIDepth", false, 3)]
private static void ShowNGUIDepth()
{
mType = ShowHierarchyType.NGUIDepth;
}
private static void HierarchyShowTips(int instanceid, Rect selectionrect)
{
var go = EditorUtility.InstanceIDToObject(instanceid) as GameObject;
if (go == null)
return;
//控制開關(guān)
var r = new Rect(selectionrect);
r.x = r.width;
r.width = 8;
go.SetActive(GUI.Toggle(r, go.activeSelf, string.Empty));
var showText = string.Empty;
var color = Color.white;
switch (mType)
{
case ShowHierarchyType.Tag:
showText = go.tag;
break;
case ShowHierarchyType.Layer:
showText = go.layer.ToString();
break;
case ShowHierarchyType.NGUIDepth:
var ui = go.GetComponent<UIWidget>();
if (ui == null)
{
var panel = go.GetComponent<UIPanel>();
if (panel == null)
return;
color = new Color(1f, 1f, 0f);
showText = panel.depth.ToString();
}
else
{
color = Color.white;
showText = ui.depth.ToString();
}
break;
case ShowHierarchyType.None:
return;
}
//顯示文字
var m = new Rect(selectionrect);
var content = new GUIContent(showText);
var width = EditorStyles.miniLabel.CalcSize(content).x;
m.x = m.width - (width + 8);
m.width = width;
GUI.color = color;
GUI.Label(m, content, EditorStyles.miniLabel);
GUI.color = Color.white;
}
private enum ShowHierarchyType
{
Tag,
Layer,
NGUIDepth,
None
}
}