Unity扩展编辑器使用整理(一)

news2025/2/7 13:35:36

准备工作

在Unity工程中新建Editor文件夹存放编辑器脚本,

Unity中其他的特殊文件夹可以参考官方文档链接,如下:

Unity - 手册:保留文件夹名称参考 (unity3d.com)

一、菜单栏扩展

1.增加顶部菜单栏选项

使用MenuItem,包含三个参数,官方文档描述如下:

代码:

   [MenuItem("Tool/test")]
   public static void test()
   {
       Debug.Log("test.....");
   }

结果:

2.增加右键Create菜单栏选项

使用MenuItem,ItemName需要从"Assets"开始,比如需要在Create菜单栏加一个testFolder的函数

代码:

   [MenuItem("Assets/Create/testFolder")]
   public static void test2()
   {
       Debug.Log("test2....");
   }

结果:

更多Unity支持的编辑器特性,可查看官方API,地址:

CustomGridBrushAttribute - Unity 脚本 API

3.使用快捷键 

官方文档的MenuItem中使用快捷键描述如下:

官方文档链接:

Unity - 脚本 API:MenuItem (unity3d.com)

热键文本之前必须有一个空格字符:

代码:

    [MenuItem("Tool/testHotKey0 _g")]
    public static void testHotKey0()
    {
        Debug.Log("testHotKeytestHotKey0..........");
    }

结果:

 

如果不需要特殊的修饰键组合,则可以在下划线后给出键:

代码:

   [MenuItem("Tool/testHotKey #g")]
   public static void testHotKey()
   {
       Debug.Log("testHotKeytestHotKey..........");
   }

   [MenuItem("Tool/testHotKey1 #&g")]
   public static void testHotKey1()
   {
       Debug.Log("testHotKeytestHotKey1..........");
   }

结果:

支持将一些特殊的键盘键(LEFT, RIGHT, UP, DOWN, F1 ..F12、HOME、END、PGUP、PGDN、INS、DEL、BACKSPACE、TAB 和 SPACE)作为热键:

代码:

 [MenuItem("Tool/testHotKey2 #LEFT")]
 public static void testHotKey2()
 {
      Debug.Log("testHotKeytestHotKey2..........");
 }

结果:

4.弹出一个提示窗口

使用EditorUtility.DisplayDialog显示窗口,第一个参数是弹窗名,第二个参数是提示内容,第三个参数是按钮名字

代码:

    [MenuItem("Tool/testDialog")]
    public static void DisplayDialog()
    {
        EditorUtility.DisplayDialog("Tips", "Hello World", "Completely");
    }

结果:

二、自定义窗口扩展

1.创建自定义窗口

自定义窗口需要创建的窗口脚本继承子EditorWindow,然后在OnGUI中渲染窗口的实际内容,
新建一个TestWindow脚本,代码如下:

public class TestWindow : EditorWindow
{
    private void OnGUI()
    {
        //渲染窗口的实际内容
    }
}

编写打开窗口的函数,代码如下:

[MenuItem("CustomWindow/ShowTestWin")]
public static void ShowWindow()
{
   //显示窗口实例
   //EditorWindow.GetWindow(typeof(TestWindow));
   //显示窗口按照自定位置和大小,比如(0,0)点,宽600,长800
   EditorWindow.GetWindowWithRect<TestWindow>(new Rect(new Vector2(0,0),new Vector2(600,800)));
}

结果:

EditorWindow类中的方法:

官方文档描述如下:

更多方法可参考:Unity - 脚本 API:EditorWindow (unity3d.com)

代码:

public class TestWindow : EditorWindow
{
    [MenuItem("CustomWindow/ShowTestWin")]
    public static void ShowWindow()
    {
        //显示窗口实例,可以使用鼠标更改大小
        //EditorWindow.GetWindow(typeof(TestWindow));
        //显示窗口按照自定位置和大小,比如(0,0)点,宽600,长800,不可以使用鼠标更改大小
        EditorWindow.GetWindowWithRect<TestWindow>(new Rect(new Vector2(0,0),new Vector2(600,800)));
    }

    private void OnEnable()
    {
        //在加载脚本或者启用对象时调用
        Debug.Log("OnEnable");
    }

    private void CreateGUI()
    {
        //如果Editor未更新,则生成图形用户界面
        Debug.Log("CreateGUI");
    }

    private void Update()
    {
        //每帧调用一次以更新脚本的逻辑
        Debug.Log("Updaete");
    }

    private void OnDisable()
    {
        //当脚本被禁用或者对象被销毁以完成和清理资源时调用
        Debug.Log("OnDisable");
    }

    private void OnGUI()
    {
        //每帧多次调用,用于渲染和处理GUI事件
        //渲染窗口的实际内容
        Debug.Log("OnGUI");
    }
}

结果:

2.增加窗口内容

1.使用EditorGUI类

1.actionKey


使用代码:

  private void OnGUI()
  {
      //渲染窗口的实际内容
      if (EditorGUI.actionKey)
      {
          //是否按住了平台相关的“action”修改键?(只读),该键在 macOS 上为 Command,在 Windows 上为 Control
          Debug.Log("按下了actionKey");
      }
  }

结果:

2.indentLevel

 使用代码:

    private void OnGUI()
    {
        //渲染窗口的实际内容
        //使用indentLevel缩进文本
        EditorGUI.indentLevel++;
        EditorGUILayout.LabelField("P1:");
        EditorGUI.indentLevel++;
        EditorGUILayout.LabelField("P2:");
        EditorGUI.indentLevel++;
        EditorGUILayout.LabelField("P3:");
        EditorGUI.indentLevel--;
        EditorGUI.indentLevel--;
        EditorGUILayout.LabelField("P1:");
        EditorGUI.indentLevel++;
        EditorGUILayout.LabelField("P2:");
    }

结果:

3.showMixedValue

具体作用可以看下面两篇文章

EditorGUI.showMixedValue 什么都不做?- Unity 引擎 - Unity 讨论

Unity - 脚本 API:EditorGUI.showMixedValue (unity3d.com)

就是可以让在 GUI 中以非标准方式表示值,同时支持多对象编辑,也就是通过设置此值为true,让枚举值没有在面板选择值时显示为

代码:

    private void OnGUI()
    {
        //渲染窗口的实际内容
        EditorGUI.showMixedValue = true;
        // 将isFast布尔值转换为enum值
        SpeedOption speedOptionEnumValue = SpeedOption.Fast;
        // 在下拉菜单中显示枚举值:
        speedOptionEnumValue = (SpeedOption)EditorGUILayout.EnumPopup("Speed", speedOptionEnumValue);
        // 将showMixedValue设置为false,这样它就不会影响以下控件(如果有的话):
        EditorGUI.showMixedValue = false;
    }

结果:

4.BeginChangeCheck,EndChangeCheck

EndChangeCheck返回值如下

代码:

float value = 0; 
private void OnGUI()
{
     //渲染窗口的实际内容
     EditorGUI.BeginChangeCheck();
     value = EditorGUILayout.Slider(value, 0, 1);
     if (EditorGUI.EndChangeCheck())
     {
         this.ShowTips("变量检查成功!");
     }
}

结果:

5.BeginDisabledGroup,EndDisabledGroup

 BeginChangeCheck参数如下:

 使用这两个API可以禁用执行在其中间的多个组件。

代码:

    private void OnGUI()
    {
        //渲染窗口的实际内容
        EditorGUI.BeginDisabledGroup(false);
        EditorGUI.TextField(new Rect(new Vector2(0,150),new Vector2(300,50)), "TestDisabledGroup");
        EditorGUI.DropdownButton(new Rect(new Vector2(300, 150), new Vector2(100, 50)),this.titleContent,FocusType.Keyboard);
        EditorGUI.EndDisabledGroup();

    }

结果:

当BeginDisabledGroup传入值为false时,

当BeginDisabledGroup传入值为true时,

6.BeginFoldoutHeaderGroup,EndFoldoutHeaderGroup

BeginFoldoutHeaderGroup参数如下:

代码:

public void TestFoldoutHeaderGroup()
{
        isShow = EditorGUI.BeginFoldoutHeaderGroup(new Rect(new Vector2(0, 200), new Vector2(120, 50)), isShow, "TEST Folder", null, ShowHeaderContextMenu);
        if (isShow)
        {
            if (Selection.activeTransform)
            {
                Selection.activeTransform.position = EditorGUI.Vector3Field(new Rect(0, 220, 200, 100), "Position", Selection.activeTransform.position);
            }
            else
            {
                EditorGUI.LabelField(new Rect(0, 220, 200, 20),"请先选中一个物体!");
            }
        }
        EditorGUI.EndFoldoutHeaderGroup();
}

Color mColor;
void ShowHeaderContextMenu(Rect position)
{
        isShow = !isShow;
        GenericMenu menu = new GenericMenu();
        menu.AddItem(new GUIContent("RGB/Red"), mColor.Equals(Color.red), (color) =>{ mColor = (Color)color; },Color.red);
        menu.AddItem(new GUIContent("RGB/Black"), mColor.Equals(Color.black), (color) => { mColor = (Color)color; }, Color.black);
        menu.AddItem(new GUIContent("RGB/White"), mColor.Equals(Color.white), (color) => { mColor = (Color)color; }, Color.white);
        menu.ShowAsContext();
}

结果:


生成上图中的一个UI元素,左边的可以通过foldout控制,控制显示下面需要显示的信息

右边可以选择执行方法,比如上述代码中,点击就可以显示一个菜单,如下:

7.BeginProperty,EndProperty

 BeginProperty参数如下:

8.文本字段(xxxField)

以下API都是在面板中创建一个字段显示,故放在一起整理:

BoundsField

BoundsIntField

ColorField

CurveField

EnumFlagsField

DoubleField

FloatField

IntField

LabelField

LayerField

GradientField

LongField

MaskField

MultiFloatField

MultiIntField

MultiPropertyField

ObjectField

PasswordField

PropertyField

RectField

RectIntField

TagField

TextField

Vector2Field

Vector2IntField

Vector3Field

Vector3IntField

Vector4Field

DelayedDoubleField

DelayedFloatField

DelayedIntField

DelayedTextField

9.CanCacheInspectorGUI
10.DrawPreviewTexture
11.DrawRect
12.DrawTextureAlpha
13.DropdownButton
14.DropShadowLabel
15.EnumPopup,IntPopup,Popup
16.FocusTextInControl
17.Foldout
18.GetPropertyHeight
19.HandlePrefixLabel
20.HelpBox
21.InspectorTitlebar
22.IntSlider
23.LinkButton
24.MinMaxSlider
25.PrefixLabel
26.ProgressBar
27.SelectableLabel
28.Slider
29.TextArea
30.Toggle,ToggleLeft

2.使用EditorGUILayout类

与EditorGUI不相同的API部分:

相同的部分:

3.使用GUI类:

4.使用GUILayaout类:

三、自定义Inspectors面板扩展

1.建立一个脚本面板扩展的编辑器脚本

新建一个TestEditorInspector脚本,用于自定义物体上的TestData脚本的Inspector面板

TestEditorInspector需要继承自Editor类,通过CustomEditor特性将编辑器脚本与脚本组件关联

代码:

[CustomEditor(typeof(TestData))]
public class TestEditorInspector : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        //自定义Inspector内容
    }
}

2.增加面板内容

1.使用EditorGUI类(同上)

2.使用EditorGUILayout类(同上)

3.使用GUI类(同上)

4.使用GUILayaout类(同上)

参考:

《Extending Unity with Editor Scripting》

扩展编辑器 - Unity 手册 (unity3d.com)

EditorWindow - Unity 脚本 API

Unity - 手动:使用 C# 脚本创建自定义 Editor 窗口 (unity3d.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2294315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何查看:Buildroot所使用Linux的版本号、gcc交叉编译工具所使用的Linux的版本号、开发板上运行的Linux系统的版本号

定义编号①②③的含义 将“Buildroot所使用Linux的版本号”编号为① 将“gcc交叉编译工具所使用的Linux的版本号”编号为② 将“开发板上运行的Linux系统的版本号”编号为③ 查看①和②的共同方法(通过sysroot查看) 由于此二者都有目录sysroot&#xff0c;而通过目录sysroot…

html转PDF文件最完美的方案(wkhtmltopdf)

目录 需求 一、方案调研 二、wkhtmltopdf使用 如何使用 文档简要说明 三、后端服务 四、前端服务 往期回顾 需求 最近在做报表类的统计项目&#xff0c;其中有很多指标需要汇总&#xff0c;网页内容有大量的echart图表&#xff0c;做成一个网页去浏览&#xff0c;同时…

deepseek本地部署

DeepSeek本地部署详细指南 DeepSeek作为一款开源且性能强大的大语言模型&#xff0c;提供了灵活的本地部署方案&#xff0c;让用户能够在本地环境中高效运行模型&#xff0c;同时保护数据隐私&#xff0c;这里记录自己DeepSeek本地部署流程。 主机环境 cpu:amd 7500Fgpu:406…

【Reading Notes】Favorite Articles from 2025

文章目录 1、January2、February3、March4、April5、May6、June7、July8、August9、September10、October11、November12、December 1、January 极越之后&#xff0c;中国车市只会倒下更多人&#xff08;2025年01月01日&#xff09; 在这波枪林弹雨中&#xff0c;合资品牌中最…

配置@别名路径,把@/ 解析为 src/

路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js &#xff0c;内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定&#xff1a; 使用 表示src文件所在路径: path.resolve(__dirname,src)…

AJAX笔记原理篇

黑马程序员视频地址&#xff1a; AJAX-Day03-01.XMLHttpRequest_基本使用https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p33https://www.bilibili.com/video/BV1MN411y7pw?vd_sour…

康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案

随着自动驾驶技术的快速发展&#xff0c;车辆准确感知周围环境的能力变得至关重要。BEV&#xff08;Birds-Eye-View&#xff0c;鸟瞰图&#xff09;感知技术&#xff0c;以其独特的视角和强大的数据处理能力&#xff0c;正成为自动驾驶领域的一大研究热点。 一、BEV感知技术概…

更换IP属地会影响网络连接速度吗

在数字化时代&#xff0c;网络连接速度对于个人用户和企业来说都至关重要。无论是日常浏览网页、观看视频&#xff0c;还是进行在线办公、游戏娱乐&#xff0c;网络速度都直接影响着我们的体验。而IP属地&#xff0c;作为网络连接中的一个重要元素&#xff0c;其变动是否会引发…

深入探索 C++17 特征变量模板 (xxx_v)

文章目录 一、C++类型特征的前世今生二、C++17特征变量模板闪亮登场三、常见特征变量模板的实际应用(一)基本类型判断(二)指针与引用判断四、在模板元编程中的关键作用五、总结与展望在C++的持续演进中,C++17带来了许多令人眼前一亮的特性,其中特征变量模板(xxx_v)以其…

无用知识研究:std::initializer_list的秘密

先说结论&#xff0c;用std::initializer_list初始化vector&#xff0c;内部逻辑是先生成了一个临时数组&#xff0c;进行了拷贝构造&#xff0c;然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化&#xff0c;这个动作又触发了拷贝…

web安全:任意文件下载漏洞

背景&#xff1a; 点击对应名字&#xff0c;下载对应图片。但服务器还存在其他文件&#xff0c;只是前端没有展示出来。通过模拟路径下载&#xff0c;可以获取到意想不到的数据。 看点击代码&#xff1a; 如果模拟没有前端的图片&#xff0c;也会发现下载了 所以这个叫任…

oracle:索引(B树索引,位图索引,分区索引,主键索引,唯一索引,联合索引/组合索引,函数索引)

索引通过存储列的排序值来加快对表中数据的访问速度&#xff0c;帮助数据库系统快速定位到所需数据&#xff0c;避免全表扫描 B树索引(B-Tree Index) B树索引是一种平衡树结构&#xff0c;适合处理范围查询和精确查找。它的设计目标是保持数据有序&#xff0c;并支持高效的插入…

【CPP】CPP经典面试题

文章目录 引言1. C 基础1.1 C 中的 const 关键字1.2 C 中的 static 关键字 2. 内存管理2.1 C 中的 new 和 delete2.2 内存泄漏 3. 面向对象编程3.1 继承和多态3.2 多重继承 4. 模板和泛型编程4.1 函数模板4.2 类模板 5. STL 和标准库5.1 容器5.2 迭代器 6. 高级特性6.1 移动语义…

C++11详解(三) -- 可变参数模版和lambda

文章目录 1.可变模版参数1.1 基本语法及其原理1.2 包扩展1.3 empalce系列接口1.3.1 push_back和emplace_back1.3.2 emplace_back在list中的使用&#xff08;模拟实现&#xff09; 2. lambda2.1 lambda表达式语法 1.可变模版参数 1.1 基本语法及其原理 1. C11支持可变参数模版&…

网站打开提示不安全

当网站打开时显示“不安全”提示&#xff08;通常表现为浏览器地址栏中出现“不安全”字样或红色警告图标&#xff09;&#xff0c;这意味着网站未使用有效的SSL证书或HTTPS协议&#xff0c;导致浏览器认为连接不安全。以下是解决这一问题的详细步骤&#xff1a; 一. 原因分析 …

OpenCV:特征检测总结

目录 一、什么是特征检测&#xff1f; 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT&#xff08;尺度不变特征变换&#xff09; 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…

python学opencv|读取图像(五十七)使用cv2.bilateralFilter()函数实现图像像素双边滤波处理

【1】引言 前序学习过程中&#xff0c;已经掌握了对图像的基本滤波操作技巧&#xff0c;具体的图像滤波方式包括均值滤波、中值滤波和高斯滤波&#xff0c;相关文章链接有&#xff1a; python学opencv|读取图像&#xff08;五十四&#xff09;使用cv2.blur()函数实现图像像素…

【SQL技术】不同数据库引擎 SQL 优化方案剖析

一、引言 在数据处理和分析的世界里&#xff0c;SQL 是不可或缺的工具。不同的数据库系统&#xff0c;如 MySQL、PostgreSQL&#xff08;PG&#xff09;、Doris 和 Hive&#xff0c;在架构和性能特点上存在差异&#xff0c;因此针对它们的 SQL 优化策略也各有不同。这些数据库中…

链式结构二叉树(递归暴力美学)

文章目录 1. 链式结构二叉树1.1 二叉树创建 2. 前中后序遍历2.1 遍历规则2.2 代码实现图文理解 3. 结点个数以及高度等二叉树结点个数正确做法&#xff1a; 4. 层序遍历5. 判断是否完全二叉树 1. 链式结构二叉树 完成了顺序结构二叉树的代码实现&#xff0c;可以知道其底层结构…

技术文档管理最佳实践:高效、专业、可持续

文章目录 技术文档管理最佳实践&#xff1a;高效、专业、可持续1. 技术文档的核心价值1.1 降低知识流失风险1.2 提升开发效率1.3 增强团队协作1.4 规范技术资产管理 2. 技术文档分类与规范2.1 代码相关文档2.2 过程与运维文档2.3 知识与培训文档 3. 工具选型&#xff1a;自动化…