【Unity】自定義編輯器之Hierarchy

寫在前面

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

顯示Tag
顯示NGUI層次

基本原理

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
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄 1、介紹兩大UI插件NGUI和UGUI2、unity渲染順序控制方式3、NGUI的控制4、UGUI的控制5、...
    小飛不會(huì)飛_閱讀 7,347評(píng)論 4 13
  • 111. [動(dòng)畫系統(tǒng)]如何將其他類型的動(dòng)畫轉(zhuǎn)換成關(guān)鍵幀動(dòng)畫? 動(dòng)畫->點(diǎn)緩存->關(guān)鍵幀 112. [動(dòng)畫]Unit...
    胤醚貔貅閱讀 13,557評(píng)論 3 88
  • Unity技術(shù)面試題 一:什么是協(xié)同程序? 答:在主線程運(yùn)行時(shí)同時(shí)開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行。換句話...
    沐冉閱讀 3,037評(píng)論 1 19
  • 最先執(zhí)行的方法是: 1、(激活時(shí)的初始化代碼)Awake,2、Start、3、Update【FixUpdate、L...
    困卡閱讀 4,502評(píng)論 0 8
  • 這個(gè)是我剛剛整理出的Unity面試題,為了幫助大家面試,同時(shí)幫助大家更好地復(fù)習(xí)Unity知識(shí)點(diǎn),如果大家發(fā)現(xiàn)有什么...
    編程小火雞閱讀 4,006評(píng)論 2 34

友情鏈接更多精彩內(nèi)容