Unity Editor 自定义属于你的DefaultHeaderGUI

94 篇文章 273 订阅
4 篇文章 0 订阅

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神码编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值