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)需要的组件,修改很多细节上的设定等等,这比你一条一条属性去设置要快捷方便得多,也不容易漏掉什么重要设置,很显然这是批处理的好方法。

猜你喜欢

转载自blog.csdn.net/qq992817263/article/details/106639725
今日推荐