首页 > 其他分享 >Unity Editor 自定义属于你的DefaultHeaderGUI

Unity Editor 自定义属于你的DefaultHeaderGUI

时间:2022-12-13 14:34:47浏览次数:52  
标签:obj 自定义 GameObject GUI enabled GUILayout DefaultHeaderGUI Unity static


DefaultHeaderGUI

默认页眉GUI,是Unity编辑器中的所有对象被选中后在Inspector界面显示的页眉GUI,如下图红框区域:

Unity Editor 自定义属于你的DefaultHeaderGUI_页眉


Unity Editor 自定义属于你的DefaultHeaderGUI_页眉_02


在这个区域加点自己的东西。

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();
}
}

返回到编辑器,编译完成后,我们选中任意对象测试:

Unity Editor 自定义属于你的DefaultHeaderGUI_快捷操作_03


Unity Editor 自定义属于你的DefaultHeaderGUI_控件_04


Unity Editor 自定义属于你的DefaultHeaderGUI_Unity_05


可见,我的地盘文字此时已经占领了页眉的部分阵地。

快捷操作

接下来我们写一些针对我们自己项目的有趣的快捷操作,比如所有的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();
}
}

返回到编辑器,编译完成后,我们选中场景中任意对象测试:

选中一个空物体:

Unity Editor 自定义属于你的DefaultHeaderGUI_快捷操作_06


点击玩家身份后面的设置为他按钮(这个空物体的Tag和层级变成了我们规定的样子):

Unity Editor 自定义属于你的DefaultHeaderGUI_Unity_07


选中主摄像机:

Unity Editor 自定义属于你的DefaultHeaderGUI_控件_08

结语

OK,你可以在设置为指定身份(比如Player)后,再做其他的任何事,比如将他预制成某某形式,或者添加许多(Player)需要的组件,修改很多细节上的设定等等,这比你一条一条属性去设置要快捷方便得多,也不容易漏掉什么重要设置,很显然这是批处理的好方法。


标签:obj,自定义,GameObject,GUI,enabled,GUILayout,DefaultHeaderGUI,Unity,static
From: https://blog.51cto.com/u_15911199/5934048

相关文章

  • Unity UGUI图文混排(六) -- 超链接
    图文混排更新到超链接这儿,好像也差不多了,不过就在最后一点,博主也表现得相当不专业,直接整合了山中双木林同学提供的超链接的解决方案,博主甚至没来得及细看就直接复制了,但感觉......
  • Unity Hex Map技术测试
    HexMap常用于战棋的地形,最近有这方面的需求,做一个简单的测试,从画一个正六边形开始。0x00.正六边形如上图所示,两个圆,可以很规范的画一个六变形。外圆半径定为:​​publicco......
  • 【Unity】MeshEditor.Effects.Vortex 网格编辑器特效篇之涡流特效:开启你的不会Shader
    更新日期:2020年4月22日。Github源码:​​​[点我获取源码]​​索引​​前言​​​​扩展​​​​Vortex​​​​使用​​​​参数​​​​原理及算法​​​​图像展示​​前......
  • Unity角色残影特效
    残影特效在网上有很多例子,比如​​这个​​,我参考着自己整合了一下,算是整合了一个比较完整且特别简单易用的出来,只需要一个脚本挂上去无需任何设定就能用。这里只针对Skinne......
  • 【Unity】 HTFramework框架(三十四)框架实用特性
    更新日期:2020年11月6日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​框架实用特性​​​​LnkTools特性(快捷工具)​​​​CSDNBlogURL......
  • Unity 资源管理插件
    之所以写这个插件呢,就是为了方便整理项目中的资源文件,我记得之前好像也用了这么一个插件,但是也没去找,还是自己动手写一个吧,需要什么功能就看自己的需求。在项目的过程中呢,已......
  • 【Unity】 HTFramework框架(三十三)XLua热更新
    更新日期:2020年3月20日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​XLua热更新简介​​​​使用XLua热更新​​​​创建XLua开发环境......
  • 【Unity】 HTFramework框架(三十二)授权验证
    更新日期:2020年3月2日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​授权验证简介​​​​使用授权验证​​​​取消永久授权​​​​......
  • Unity插件 - MeshEditor(八)模型镜像特效
    将静态模型(带MeshFilter)按指定轴向、指定距离克隆一个镜像物体出来,思路很简单,将模型的顶点坐标按指定轴取反,并累加上设定的距离值,然后就完毕了!不过,因为镜像体的顶点镜像于之......
  • 【Unity】 HTFramework框架(三十一)全局设置
    更新日期:2020年3月2日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​全局设置简介​​​​使用全局设置​​​​打开全局设置面板​​......