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

准备工作

在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,长800EditorWindow.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 上为 ControlDebug.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.rhkb.cn/news/13236.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫js逆向之某音乐平台案例

【注意&#xff01;&#xff01;&#xff01;】 前言&#xff1a; - 本章主要讲解某音乐平台的js逆向知识 - 使用关键字搜定位加密入口 - 通过多篇文章【文字案例】的形式系统化进行描述 - 本文章全文进行了脱敏处理 - 详细代码不进行展示&#xff0c;需要则私聊作者 爬虫js逆向…

腾讯云 TI 平台部署与调用DeepSeek-R1大模型的实战指南

今天我们将继续探讨如何部署一个私有化的 DeepSeek-R1 大模型&#xff0c;具体的部署过程我们将利用腾讯云的 TI 平台进行操作。当前&#xff0c;腾讯云 TI 平台为用户提供了免费体验的满血版 DeepSeek-R1 大模型&#xff0c;同时该平台还提供了开放的 API 接口服务&#xff0c…

Python自动化测试selenium指定截图文件名方法

这篇文章主要介绍了Python自动化测试selenium指定截图文件名方法&#xff0c;Selenium 支持 Web 浏览器的自动化&#xff0c;它提供一套测试函数&#xff0c;用于支持 Web 自动化测试&#xff0c;下文基于python实现指定截图文件名方法&#xff0c;需要的小伙伴可以参考一下 前…

Gurobi基础语法之 addConstr, addConstrs, addQConstr, addMQConstr

在新版本的 Gurobi 中&#xff0c;向 addConstr 这个方法中传入一个 TempConstr 对象&#xff0c;在模型中就会根据这个对象生成一个约束。更重要的是&#xff1a;TempConstr 对象可以传给所有addConstr系列方法&#xff0c;所以下面先介绍 TempConstr 对象 TempConstr TempC…

Django框架丨从零开始的Django入门学习

Django 是一个用于构建 Web 应用程序的高级 Python Web 框架&#xff0c;Django是一个高度模块化的框架&#xff0c;使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能…

Redis --- 秒杀优化方案(阻塞队列+基于Stream流的消息队列)

下面是我们的秒杀流程&#xff1a; 对于正常的秒杀处理&#xff0c;我们需要多次查询数据库&#xff0c;会给数据库造成相当大的压力&#xff0c;这个时候我们需要加入缓存&#xff0c;进而缓解数据库压力。 在上面的图示中&#xff0c;我们可以将一条流水线的任务拆成两条流水…

开源AI智能名片2 + 1链动模式S2B2C商城小程序:内容价值创造与传播新引擎

摘要&#xff1a;本文聚焦于信息爆炸时代下&#xff0c;内容价值的创造与传播。随着用户角色的转变&#xff0c;其在内容生产与传播中的价值日益凸显。同时&#xff0c;深入探讨开源AI智能名片2 1链动模式S2B2C商城小程序这一创新商业模式&#xff0c;如何借助用户创造内容并传…

游戏引擎 Unity - Unity 打开项目、Unity Editor 添加简体中文语言包模块、Unity 项目设置为简体中文

Unity Unity 首次发布于 2005 年&#xff0c;属于 Unity Technologies Unity 使用的开发技术有&#xff1a;C# Unity 的适用平台&#xff1a;PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域&#xff1a;开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…

AllData数据中台核心菜单十二:数据同步平台

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨奥零数据科技官网&#xff1a;…

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波&#xff0c;现在&#xff0c;我们尝试的想要捕获我们的PWM波&#xff0c;测量它的频率&#xff0c;我们应该怎么做呢&#xff1f;答案还是回到我们的定时器上。 我们知道&#xff0c;定时器是一个高级的秒表&#xff08;参考笔者的比喻&a…

数字人|通过语音和图片来创建高质量的视频

简介 arXiv上的计算机视觉领域论文&#xff1a; AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation AniPortrait&#xff1a;照片级真实感肖像动画的音频驱动合成 核心内容围绕一种新的人像动画合成框架展开。 研究内容 提出 AniPortrait 框架&a…

stm32点灯 GPIO的输出模式

目录 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置&#xff08; 默认不变&#xff09;HSI 高速内部时钟8Mhz 5.项目配置 6.代码 延时1s循环LED亮灭 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置&#xff08; 默认不变&#xff09…

OpenEuler学习笔记(十六):搭建postgresql高可用数据库环境

以下是在OpenEuler系统上搭建PostgreSQL高可用数据环境的一般步骤&#xff0c;通常可以使用流复制&#xff08;Streaming Replication&#xff09;或基于Patroni等工具来实现高可用&#xff0c;以下以流复制为例&#xff1a; 安装PostgreSQL 配置软件源&#xff1a;可以使用O…

Sentinel的安装和做限流的使用

一、安装 Release v1.8.3 alibaba/Sentinel GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) - Release v1.8.3 alibaba/Sentinelhttps://github.com/alibaba/Senti…

【C++】STL——stack的底层实现

目录 &#x1f495; 1.适配器Container &#x1f495;2.真实的底层实现 &#x1f495;3.测试用例 &#x1f495;4.完结 一个人的坚持到底有多难 声明:需先了解vector&#xff0c;list&#xff0c;stack的使用 &#x1f495; 1.适配器Container 在实现栈的底层实现时&am…

PostgreSQL证书什么样子的?

PostgreSQL证书&#xff0c;一般指的是PostgreSQL数据库的能力认证证书&#xff0c;跟Oracle数据库的认证(OCA、OCP、OCM&#xff0c;这里的“O”表示Oracle)类似&#xff0c;这里介绍的PostgreSQL数据库认证也分为三种&#xff0c;分别是PGCA、PGCP、PGCM&#xff0c;这里的“…

每日Attention学习18——Grouped Attention Gate

模块出处 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模块名称 Grouped Attention Gate (GAG) 模块作用 轻量特征融合 模块结构 模块特点 特征融合前使用Group…

Three.js 后期处理(Post-Processing)详解

目录 前言 一、什么是后期处理&#xff1f; 二、Three.js 后期处理的工作流程 2.1 创建 EffectComposer 2.2 添加渲染通道&#xff08;Render Pass&#xff09; 2.3 应用最终渲染 三、后期处理实现示例 3.1 基础代码 四、常见的后期处理效果 4.1 辉光效果&#xf…

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?

如果你曾搭建过Kubernetes集群,就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间,你要同时应对许多变动的因素。对于许多配置而言,使用二层(L2)网络就完全能满足需求。但边界网关协议(BGP)—— 支撑互联网运行的技术 —— 也逐渐出…

数据结构初探:链表之双向链表篇

本文图皆为作者手绘,所有代码基于vs2022运行测试 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 文章目录 系列文章目录前言一.双向链表的概念二.双向链表的存储结构三.准备工作四.双向链表的增删查改的实现1.List.h2.List.c2.1双向链表的可复用的节点创建函…