Unity Editor 自定義屬於你的DefaultHeaderGUI

DefaultHeaderGUI

默認頁眉GUI,是Unity編輯器中的所有對象被選中後在Inspector界面顯示的頁眉GUI,如下圖紅框區域:
在這裏插入圖片描述
在這裏插入圖片描述
在這個區域加點自己的東西。

finishedDefaultHeaderGUI

只需要將自己的GUI方法註冊到事件Editor.finishedDefaultHeaderGUI即可,在GUI方法中你可以書寫任何已知的GUI控件代碼,如下,新建一個類DefaultHeaderDisplay,將他放到Editor文件夾下,並在其中鍵入如下代碼:

using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public static class DefaultHeaderDisplay
{
    static DefaultHeaderDisplay()
    {
        Editor.finishedDefaultHeaderGUI += OnDefaultHeaderGUI;
    }

    private static void OnDefaultHeaderGUI(Editor editor)
    {
        GUILayout.BeginHorizontal();
        GUILayout.Label("我的地盤", GUILayout.Width(50));
        GUILayout.EndHorizontal();
    }
}

返回到編輯器,編譯完成後,我們選中任意對象測試:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
可見,我的地盤文字此時已經佔領了頁眉的部分陣地。

快捷操作

接下來我們寫一些針對我們自己項目的有趣的快捷操作,比如所有的GameObject我都讓他支持一鍵設置自己的身份。

憑我們的喜好,我們如下分配身份:

  • Tag爲Untagged,Layer爲Default,身份:默認物體
  • Tag爲MainCamera,Layer爲Default,身份:主攝像機
  • Tag爲Player,Layer爲Player,身份:玩家

鍵入三種身份的鑑別代碼及快捷設置代碼:

    private static bool IsDefualt(GameObject obj)
    {
        return obj.CompareTag("Untagged") && obj.layer == LayerMask.NameToLayer("Default");
    }

    private static void SetToDefualt(GameObject obj)
    {
        obj.tag = "Untagged";
        obj.layer = LayerMask.NameToLayer("Default");
    }

    private static bool IsMainCamera(GameObject obj)
    {
        return obj.CompareTag("MainCamera") && obj.layer == LayerMask.NameToLayer("Default");
    }

    private static void SetToMainCamera(GameObject obj)
    {
        obj.tag = "MainCamera";
        obj.layer = LayerMask.NameToLayer("Default");
    }

    private static bool IsPlayer(GameObject obj)
    {
        return obj.CompareTag("Player") && obj.layer == LayerMask.NameToLayer("Player");
    }

    private static void SetToPlayer(GameObject obj)
    {
        obj.tag = "Player";
        obj.layer = LayerMask.NameToLayer("Player");
    }

在剛纔的GUI方法中加入如下代碼:

    private static void OnDefaultHeaderGUI(Editor editor)
    {
        //用以判斷,只有GameObject類型的對象才定義他的頁眉UI
        GameObject obj = editor.target as GameObject;
        if (obj)
        {
            bool isDefualt = IsDefualt(obj);
            GUI.enabled = isDefualt;
            GUILayout.BeginHorizontal();
            GUILayout.Label("默認物體", GUILayout.Width(50));
            GUILayout.FlexibleSpace();
            GUI.enabled = !isDefualt;
            if (GUILayout.Button("設置爲他", EditorStyles.miniButton, GUILayout.Width(80)))
            {
                SetToDefualt(obj);
            }
            GUI.enabled = true;
            GUILayout.EndHorizontal();

            bool isMainCamera = IsMainCamera(obj);
            GUI.enabled = isMainCamera;
            GUILayout.BeginHorizontal();
            GUILayout.Label("主攝像機", GUILayout.Width(50));
            GUILayout.FlexibleSpace();
            GUI.enabled = !isMainCamera;
            if (GUILayout.Button("設置爲他", EditorStyles.miniButton, GUILayout.Width(80)))
            {
                SetToMainCamera(obj);
            }
            GUI.enabled = true;
            GUILayout.EndHorizontal();

            bool isPlayer = IsPlayer(obj);
            GUI.enabled = isPlayer;
            GUILayout.BeginHorizontal();
            GUILayout.Label("玩家", GUILayout.Width(50));
            GUILayout.FlexibleSpace();
            GUI.enabled = !isPlayer;
            if (GUILayout.Button("設置爲他", EditorStyles.miniButton, GUILayout.Width(80)))
            {
                SetToPlayer(obj);
            }
            GUI.enabled = true;
            GUILayout.EndHorizontal();
        }
    }

返回到編輯器,編譯完成後,我們選中場景中任意對象測試:

選中一個空物體:
在這裏插入圖片描述
點擊玩家身份後面的設置爲他按鈕(這個空物體的Tag和層級變成了我們規定的樣子):
在這裏插入圖片描述
選中主攝像機:
在這裏插入圖片描述

結語

OK,你可以在設置爲指定身份(比如Player)後,再做其他的任何事,比如將他預製成某某形式,或者添加許多(Player)需要的組件,修改很多細節上的設定等等,這比你一條一條屬性去設置要快捷方便得多,也不容易漏掉什麼重要設置,很顯然這是批處理的好方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章