Unity Editor 自定义属于你的DefaultHeaderGUI
DefaultHeaderGUI默认页眉GUI,是Unity编辑器中的所有对象被选中后在Inspector界面显示的页眉GUI,如下图红框区域:在这个区域加点自己的东西。finishedDefaultHeaderGUI只需要将自己的GUI方法注册到事件Editor.finishedDefaultHeaderGUI即可,在GUI方法中你可以书写任何已知的GUI控件代码,如下,新建一个类Default
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)需要的组件,修改很多细节上的设定等等,这比你一条一条属性去设置要快捷方便得多,也不容易漏掉什么重要设置,很显然这是批处理的好方法。
更多推荐
所有评论(0)