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)需要的組件,修改很多細節上的設定等等,這比你一條一條屬性去設置要快捷方便得多,也不容易漏掉什麼重要設置,很顯然這是批處理的好方法。