当前位置: 首页 > news >正文

2024-02-13 Unity 编辑器开发之编辑器拓展4 —— EditorGUIUtility

文章目录

  • 1 EditorGUIUtility 介绍
  • 2 加载资源
    • 2.1 Eidtor Default Resources
    • 2.2 不存在返回 null
    • 2.3 不存在则报错
    • 2.4 代码示例
  • 3 搜索框查询、对象选中提示
    • 3.1 ShowObjectPicker
    • 3.2 PingObject
    • 3.3 代码示例
  • 4 窗口事件传递、坐标转换
    • 4.1 CommandEvent
    • 4.2 GUIPoint 和 ScreenPoint
    • 4.3 代码示例
  • 5 指定区域使用对应鼠标指针
    • 5.1 AddCursorRect
  • 6 绘制色板、绘制曲线
    • 6.1 DrawColorSwatch
    • 6.2 DrawCurveSwatch
    • 6.3 代码示例
    • 6.4 更多 API

1 EditorGUIUtility 介绍

​ Utility 意思为“实用”,EditorGUIUtility 是 EditorGUI 中的一个实用工具类,提供 EditorGUI 相关的其他辅助 API,下面仅介绍其中相对常用的内容。

​ 官方文档:https://docs.unity3d.com/ScriptReference/EditorGUIUtility.html。

2 加载资源

2.1 Eidtor Default Resources

​ Editor Default Resources 也是 Unity 中的特殊文件夹,主要作用是放置提供给 EditorGUIUtility 加载的资源。

​ 要使用 EditorGUIUtility 公共类来加载资源,需要将资源放置在 Editor Default Resources 文件夹中(命名需要带空格)。

2.2 不存在返回 null

  • API:EditorGUIUtility.Load
  • 注意事项:
    1. 只能加载 Assets/Editor Default Resources/ 文件夹下的资源。
    2. 加载资源时,需要填写资源后缀名。

2.3 不存在则报错

  • API:EditorGUIUtility.LoadRequired
  • 注意事项:
    1. 只能加载 Assets/Editor Default Resources/ 文件夹下的资源。
    2. 加载资源时,需要填写资源后缀名。

2.4 代码示例

image-20240213124410288
public class Lesson12 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson12/EditorGUIUtility学习面板")]private static void OpenLesson12() {Lesson12 win = EditorWindow.GetWindow<Lesson12>("EditorGUIUtility学习面板");win.Show();}private Texture img;private Texture img2;private void OnGUI() {// 加载资源(如果资源不存在返回null)if (GUILayout.Button("加载编辑器图片资源"))img = EditorGUIUtility.Load("EditorTeach.png") as Texture;if (img != null)GUI.DrawTexture(new Rect(0, 50, 160, 90), img);if (GUILayout.Button("加载编辑器图片资源"))img2 = EditorGUIUtility.LoadRequired("EditorTeach.png") as Texture;if (img2 != null)GUI.DrawTexture(new Rect(0, 150, 160, 90), img2);}
}
image-20240213124345161

3 搜索框查询、对象选中提示

3.1 ShowObjectPicker

  • 作用:弹出一个搜索窗口,用于选择自己想要的资源。

  • API:EditorGUIUtility.ShowObjectPicker<资源类型>(默认被选中的对象, 是否允许查找场景对象, "查找对象名称过滤", 0);

    1. 参数 1:默认被选中的对象的引用。
    2. 参数 2:是否允许查找场景对象。
    3. 参数 3:查找对象名称过滤(比如这里的 normal 是指文件名称中有 normal 的会被搜索到)。
    4. 参数 4:controlID,默认写 0。
  • 获取选择对象:EditorGUIUtility.GetObjectPickerObject()

​ 弹出的搜索窗口会通过发送事件的形式,通知开启它的窗口对象信息的变化,通过 Event 公共类获取其它窗口发送给自己的事件。

  • Event.current:获取当前事件。
  • commandName:获取事件命令的名字。
    • ObjectSelectorUpdated:对象选择发生变化时发送。
    • ObjectSelectorClosed:对象选择窗口关闭时发送。

书写形式:

if(Event.current.commandName == "ObjectSelectorUpdated") {// 选择发生更新时,通知进入
}
else if (Event.current.commandName == "ObjectSelectorClosed") {// 选择窗口关闭时,通知进入
}

3.2 PingObject

  • EditorGUIUtility.PingObject(想要提示选中的对象);

3.3 代码示例

public class Lesson12 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson12/EditorGUIUtility学习面板")]private static void OpenLesson12() {Lesson12 win = EditorWindow.GetWindow<Lesson12>("EditorGUIUtility学习面板");win.Show();}private Texture img3;private void OnGUI() {// 搜索框查询if (GUILayout.Button("打开搜索框查询窗口")) {EditorGUIUtility.ShowObjectPicker<Texture>(null, false, "Editor", 0);}if (Event.current.commandName == "ObjectSelectorUpdated") {img3 = EditorGUIUtility.GetObjectPickerObject() as Texture;if (img3 != null)Debug.Log(img3.name);}else if (Event.current.commandName == "ObjectSelectorClosed") {img3 = EditorGUIUtility.GetObjectPickerObject() as Texture;if (img3 != null)Debug.Log("窗口关闭 - " + img3.name);}// 对象选中提示提示if (GUILayout.Button("高亮选中对象")) {if (img3 != null)EditorGUIUtility.PingObject(img3);}}
}
image-20240213125311425 image-20240213125445836

4 窗口事件传递、坐标转换

4.1 CommandEvent

  • Event e = EditorGUIUtility.CommandEvent("事件名");

​ 获取到另一个窗口后,该窗口调用 SendEvent(e),在另一个窗口中通过

  • Event.current.type == EventType.ExecuteCommand 判断
  • Event.current.commandName == "事件名" 判断

​ 在传递事件时,Unity 会自动将接受事件的窗口打开,不管对象是否有监听处理对应的内容。

4.2 GUIPoint 和 ScreenPoint

  • 屏幕坐标系:原点为屏幕左上角。
  • GUI 坐标系:原点为当前窗口左上角。
  1. GUIToScreenPoint:将点从 GUI 位置转换为屏幕空间。
  2. GUIToScreenRect:将 rect 从 GUI 位置转换为屏幕空间。
  3. ScreenToGUIPoint:将点从屏幕空间转换为 GUI 位置。
  4. ScreenToGUIRect:将 rect 从屏幕空间转换为 GUI 位置。

4.3 代码示例

public class Lesson12 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson12/EditorGUIUtility学习面板")]private static void OpenLesson12() {Lesson12 win = EditorWindow.GetWindow<Lesson12>("EditorGUIUtility学习面板");win.Show();}private void OnGUI() {// 窗口事件传递if (GUILayout.Button("传递事件")) {// 声明事件Event   e   = EditorGUIUtility.CommandEvent("我的事件");Lesson3 win = EditorWindow.GetWindow<Lesson3>();win.SendEvent(e);}if (Event.current.type == EventType.ExecuteCommand) {if (Event.current.commandName == "我的事件") {Debug.Log("收到我的事件");}}// 坐标转换if (GUILayout.Button("坐标转换测试")) {Vector2 v = new Vector2(10, 10);GUI.BeginGroup(new Rect(10, 10, 100, 100));// 转换函数 如果包裹在布局相关函数中 那么位置胡加上布局的偏移 再进行转换Vector2 screenPos = EditorGUIUtility.GUIToScreenPoint(v);GUI.EndGroup();Debug.Log("GUI:" + v + "Screen:" + screenPos);}}
}
image-20240213130359689

5 指定区域使用对应鼠标指针

5.1 AddCursorRect

  • AddCursorRect(Rect position, MouseCursor mouse);
MouseCursor鼠标光标类型枚举
Arrow普通指针箭头
Text文本文本光标
ResizeVertical调整大小垂直调整大小箭头
ResizeHorizontal调整大小水平调整大小箭头
Link带有链接徽章的链接箭头
SlideArrow滑动箭头带有小箭头的箭头,用于指示在数字字段处滑动
ResizeUpRight调整大小向上向右调整窗口边缘的大小
ResizeUpLeft窗口边缘为左
MoveArrow带有移动符号的箭头旁边用于场景视图
RotateArrow旁边有用于场景视图的旋转符号
ScaleArrow旁边有用于场景视图的缩放符号
ArrowPlus旁边带有加号的箭头
ArrowMinus旁边带有减号的箭头
Pan用拖动的手拖动光标进行平移
Orbit用眼睛观察轨道的光标
Zoom使用放大镜进行缩放的光标
FPS带眼睛的光标和用于 FPS 导航的样式化箭头键
CustomCursor当前用户定义的光标
SplitResizeUpDown向上 - 向下调整窗口拆分器的大小箭头
SplitResizeLeftRight窗口拆分器的左 - 右调整大小箭头

6 绘制色板、绘制曲线

6.1 DrawColorSwatch

  • EditorGUIUtility.DrawColorSwatch(Rect 绘制色板的矩形, Color 颜色);

​ 在指定区域绘制一个色板矩形,主要配合 EditorGUILayout.ColorField 颜色输入控件使用。

6.2 DrawCurveSwatch

  • EditorGUIUtility.DrawCurveSwatch(Rect: 绘制曲线的范围, AnimationCurve: 曲线, SerializedProperty: 要绘制为SerializedProperty的曲线, Color: 绘制曲线的颜色, Color: 绘制背景的颜色);

​ 在指定区域绘制曲线,主要配合 EditorGUILayout.CurveField 曲线输入控件使用。

6.3 代码示例

public class Lesson12 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson12/EditorGUIUtility学习面板")]private static void OpenLesson12() {Lesson12 win = EditorWindow.GetWindow<Lesson12>("EditorGUIUtility学习面板");win.Show();}private Color color;private AnimationCurve curve = new AnimationCurve();private void OnGUI() {// 绘制色板color = EditorGUILayout.ColorField(new GUIContent("选取颜色"), color, true, true, true);EditorGUIUtility.DrawColorSwatch(new Rect(180, 180, 30, 30), Color.blue);// 绘制曲线curve = EditorGUILayout.CurveField("曲线设置", curve);EditorGUIUtility.DrawCurveSwatch(new Rect(0, 300, 100, 80), curve, null, Color.red, Color.white);}
}
image-20240213131412472

6.4 更多 API

​ 官方文档:https://docs.unity3d.com/ScriptReference/EditorGUIUtility.html。

相关文章:

2024-02-13 Unity 编辑器开发之编辑器拓展4 —— EditorGUIUtility

文章目录 1 EditorGUIUtility 介绍2 加载资源2.1 Eidtor Default Resources2.2 不存在返回 null2.3 不存在则报错2.4 代码示例 3 搜索框查询、对象选中提示3.1 ShowObjectPicker3.2 PingObject3.3 代码示例 4 窗口事件传递、坐标转换4.1 CommandEvent4.2 GUIPoint 和 ScreenPoi…...

redis加锁实现方式

思考 是否有官方推荐&#xff08;自己先思考如何实现&#xff0c;然后再参考其他人的实践&#xff0c;总结优缺点&#xff09;通过哪些方式可以实现锁锁是否具有原子性锁请求失败了如何处理如果避免发生死锁如果避免发生资源抢占如果避免锁的误删 官方实现策略 安全性能&#…...

ClickHouse--08--SQL DDL 操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SQL DDL 操作1 创建库2 查看数据库3 删除库4 创建表5 查看表6 查看表的定义7 查看表的字段8 删除表9 修改表9.1 添加列9.2 删除列9.3 清空列9.4 给列修改注释9.5 修…...

5种风格非常经典的免费wordpress主题

免费wordpress主题下载 高端大气上档次的wordpress主题&#xff0c;也可以是免费的&#xff0c;可以在线免费下载。 https://www.wpniu.com/themes/288.html wordpress免费主题 高端大气的wordpress免费主题&#xff0c;LOGO在顶部左侧&#xff0c;导航菜单在顶部右侧。 ht…...

「数据结构」哈希表2:实现哈希表

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 实现哈希表 &#x1f349;扩容&#x1f349;插入&#x1f349;获取value&#x1f349;源码 &#x1f349;扩容 在讲插入之前需要…...

ITK 图像分割(一):阈值ThresholdImageFilter

效果&#xff1a; Video: 区域增加分割 1、itkThresholdImageFilter 该类的主要功能是通过设置低阈值、高阈值或介于高低阈值之间&#xff0c;则将图像值输出为用户指定的值。 如果图像值低于、高于或介于设置的阈值之间&#xff0c;该类就将图像值设置为用户指定的“外部”值…...

2023.2.6

#include<stdio.h> #include<string.h> //冒泡排序 void bubb(int arr[],int len) {for(int i1;i<len;i){for(int j0;j<len-i1;j){if(arr[j1]<arr[j]){int tarr[j];arr[j]arr[j1];arr[j1]t;}}} } //select排序 void select(int arr[],int len) {int min0;…...

例39:使用List控件

建立一个EXE工程&#xff0c;在窗体上放一个文本框&#xff0c;一个列表框和三个按钮输入如下的代码&#xff1a; Sub Form1_Command1_BN_Clicked(hWndForm As hWnd, hWndControl As hWnd)List1.AddItem(Text1.Text)End SubSub Form1_Command2_BN_Clicked(hWndForm As hWnd, h…...

浏览器内核的主要功能模块介绍

浏览器内核是浏览器的核心部分&#xff0c;负责解析网页内容、渲染页面和处理用户交互。一个典型的浏览器内核主要包括以下几个功能模块&#xff1a; 1. **解析器&#xff08;Parser&#xff09;**&#xff1a; 解析器负责解析网页内容&#xff0c;包括HTML…...

如何流畅进入Github

前言 以下软件是免费的&#xff0c;放心用 一、进入右边的下载链接https://steampp.net/ 二、点击下载 三、点击接受并下载 四、随便选一个下载链接进行下载 五、软件安装好打开后&#xff0c;找到Github 六、点击全部启用 七、再点击左上角的一键加速 八、这个时候你再进Git…...

docker磁盘不足!已解决~

目录 &#x1f35f;1.查看docker镜像目录 &#x1f9c2;2.停止docker服务 &#x1f953;3.创建新的目录 &#x1f32d;4.迁移目录 &#x1f37f;5.编辑迁移的目录 &#x1f95e;6.重新加载docker &#x1f354;7.检擦docker新目录 &#x1f373;8.删掉旧目录 1.查看doc…...

法国实习面试——计算机相关专业词汇

法语 1.Spcialit - 专业 2.Systme - 系统 3.Embarqus - 嵌入式 4.Logicielle - 软件 5.Distribus - 分布式 6.lectronique - 电子 7.nergie lectrique - 电能 8.Automatisation - 自动化 9.Une exprience de stage - 实习经验 10.Automobiles - 汽车 11.tre charg…...

LeetCode刷题计划

LeetCode刷题计划 推荐 代码随想录&#xff1a;https://github.com/youngyangyang04/leetcode-master 卡码网 练习ACM模式 https://kamacoder.com/ 01 #include <iostream> using namespace std;int main() {int a ,b;while(cin>>a>>b){cout<<ab<…...

2023全球云计算市场份额排名

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 最近Synergy研究院发布了最新的全球云计算市场份额排名。 亚马逊依旧是以31%的的市场份额排名第一&#xff0c;微软azure24%排名第二&#xff0c;Google云11%排名第三&#xff0c;阿里云4%排名第四。腾讯云和IBM、…...

Oracle数据库

1. 请解释什么是分区表&#xff08;Partitioned Table&#xff09;以及它的优点。 分区表是一种数据库技术&#xff0c;它将一个大表分成多个小的、更易于管理的部分&#xff0c;每个部分称为一个分区。以下是Oracle分区表的一些优点&#xff1a; 提高查询性能&#xff1a;通…...

Spring Cloud Hystrix 参数配置、简单使用、DashBoard

Spring Cloud Hystrix 文章目录 Spring Cloud Hystrix一、Hystrix 服务降级二、Hystrix使用示例三、OpenFeign Hystrix四、Hystrix参数HystrixCommand.Setter核心参数Command PropertiesFallback降级配置Circuit Breaker 熔断器配置Metrix 健康统计配置Request Context 相关参数…...

阿里云服务器4核16G配置报价和CPU内存性能参数表

阿里云4核16G服务器优惠价格ECS云服务器经济型e实例26元1个月、149元半年、79元3个月&#xff0c;4核16G通用算力u1服务器、通用型g7、通用型g8i、AMD通用型g8a、性能增强通用型g8ae、高主频通用型hfg8i、AMD通用型g7a、内存型r7p等均提供4核16G配置。阿里云服务器网aliyunfuwu…...

数据结构:图文详解 队列 | 循环队列 的各种操作(出队,入队,获取队列元素,判断队列状态)

目录 队列的概念 队列的数据结构 队列的实现 入队 出队 获取队头元素 获取队列长度 循环队列的概念 循环队列的数据结构 循环队列的实现 判断队列是否为空 判断队列是否已满 入队 出队 得到队头元素 得到队尾元素 队列的概念 队列&#xff08;Queue&#xff0…...

Debezium发布历史130

原文地址&#xff1a; https://debezium.io/blog/2022/10/10/debezium-2.0-cr1-released/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 2.0.0.CR1 Released October 10, 2022 by Chris Cranford rel…...

【笔记】Harmony学习:下载安装 DevEco Studio 开发工具IDE

IDE 安装 从官网下载DevEco Studio 安装包后进行安装&#xff0c; 安装完毕后&#xff0c;本地环境可能要配置相关工具&#xff0c;可以通过下面的诊断检测一下本地环境&#xff0c;通过蓝色“Set it up now” 可以快速安装。 1. Node.js (for ohpm) 2. ohpm 下载op的包管理&a…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...