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 - 注意事项:
- 只能加载
Assets/Editor Default Resources/文件夹下的资源。 - 加载资源时,需要填写资源后缀名。
- 只能加载
2.3 不存在则报错
- API:
EditorGUIUtility.LoadRequired - 注意事项:
- 只能加载
Assets/Editor Default Resources/文件夹下的资源。 - 加载资源时,需要填写资源后缀名。
- 只能加载
2.4 代码示例
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);}
}
3 搜索框查询、对象选中提示
3.1 ShowObjectPicker
-
作用:弹出一个搜索窗口,用于选择自己想要的资源。
-
API:
EditorGUIUtility.ShowObjectPicker<资源类型>(默认被选中的对象, 是否允许查找场景对象, "查找对象名称过滤", 0);- 参数 1:默认被选中的对象的引用。
- 参数 2:是否允许查找场景对象。
- 参数 3:查找对象名称过滤(比如这里的 normal 是指文件名称中有 normal 的会被搜索到)。
- 参数 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);}}
}
4 窗口事件传递、坐标转换
4.1 CommandEvent
Event e = EditorGUIUtility.CommandEvent("事件名");
获取到另一个窗口后,该窗口调用 SendEvent(e),在另一个窗口中通过
Event.current.type == EventType.ExecuteCommand判断Event.current.commandName == "事件名"判断
在传递事件时,Unity 会自动将接受事件的窗口打开,不管对象是否有监听处理对应的内容。
4.2 GUIPoint 和 ScreenPoint
- 屏幕坐标系:原点为屏幕左上角。
- GUI 坐标系:原点为当前窗口左上角。
GUIToScreenPoint:将点从 GUI 位置转换为屏幕空间。GUIToScreenRect:将 rect 从 GUI 位置转换为屏幕空间。ScreenToGUIPoint:将点从屏幕空间转换为 GUI 位置。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);}}
}
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);}
}
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加锁实现方式
思考 是否有官方推荐(自己先思考如何实现,然后再参考其他人的实践,总结优缺点)通过哪些方式可以实现锁锁是否具有原子性锁请求失败了如何处理如果避免发生死锁如果避免发生资源抢占如果避免锁的误删 官方实现策略 安全性能&#…...
ClickHouse--08--SQL DDL 操作
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 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主题,也可以是免费的,可以在线免费下载。 https://www.wpniu.com/themes/288.html wordpress免费主题 高端大气的wordpress免费主题,LOGO在顶部左侧,导航菜单在顶部右侧。 ht…...
「数据结构」哈希表2:实现哈希表
🎇个人主页:Ice_Sugar_7 🎇所属专栏:Java数据结构 🎇欢迎点赞收藏加关注哦! 实现哈希表 🍉扩容🍉插入🍉获取value🍉源码 🍉扩容 在讲插入之前需要…...
ITK 图像分割(一):阈值ThresholdImageFilter
效果: Video: 区域增加分割 1、itkThresholdImageFilter 该类的主要功能是通过设置低阈值、高阈值或介于高低阈值之间,则将图像值输出为用户指定的值。 如果图像值低于、高于或介于设置的阈值之间,该类就将图像值设置为用户指定的“外部”值…...
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工程,在窗体上放一个文本框,一个列表框和三个按钮输入如下的代码: 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…...
浏览器内核的主要功能模块介绍
浏览器内核是浏览器的核心部分,负责解析网页内容、渲染页面和处理用户交互。一个典型的浏览器内核主要包括以下几个功能模块: 1. **解析器(Parser)**: 解析器负责解析网页内容,包括HTML…...
如何流畅进入Github
前言 以下软件是免费的,放心用 一、进入右边的下载链接https://steampp.net/ 二、点击下载 三、点击接受并下载 四、随便选一个下载链接进行下载 五、软件安装好打开后,找到Github 六、点击全部启用 七、再点击左上角的一键加速 八、这个时候你再进Git…...
docker磁盘不足!已解决~
目录 🍟1.查看docker镜像目录 🧂2.停止docker服务 🥓3.创建新的目录 🌭4.迁移目录 🍿5.编辑迁移的目录 🥞6.重新加载docker 🍔7.检擦docker新目录 🍳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刷题计划 推荐 代码随想录: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全球云计算市场份额排名
关注卢松松,会经常给你分享一些我的经验和观点。 最近Synergy研究院发布了最新的全球云计算市场份额排名。 亚马逊依旧是以31%的的市场份额排名第一,微软azure24%排名第二,Google云11%排名第三,阿里云4%排名第四。腾讯云和IBM、…...
Oracle数据库
1. 请解释什么是分区表(Partitioned Table)以及它的优点。 分区表是一种数据库技术,它将一个大表分成多个小的、更易于管理的部分,每个部分称为一个分区。以下是Oracle分区表的一些优点: 提高查询性能:通…...
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个月,4核16G通用算力u1服务器、通用型g7、通用型g8i、AMD通用型g8a、性能增强通用型g8ae、高主频通用型hfg8i、AMD通用型g7a、内存型r7p等均提供4核16G配置。阿里云服务器网aliyunfuwu…...
数据结构:图文详解 队列 | 循环队列 的各种操作(出队,入队,获取队列元素,判断队列状态)
目录 队列的概念 队列的数据结构 队列的实现 入队 出队 获取队头元素 获取队列长度 循环队列的概念 循环队列的数据结构 循环队列的实现 判断队列是否为空 判断队列是否已满 入队 出队 得到队头元素 得到队尾元素 队列的概念 队列(Queue࿰…...
Debezium发布历史130
原文地址: https://debezium.io/blog/2022/10/10/debezium-2.0-cr1-released/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. Debezium 2.0.0.CR1 Released October 10, 2022 by Chris Cranford rel…...
【笔记】Harmony学习:下载安装 DevEco Studio 开发工具IDE
IDE 安装 从官网下载DevEco Studio 安装包后进行安装, 安装完毕后,本地环境可能要配置相关工具,可以通过下面的诊断检测一下本地环境,通过蓝色“Set it up now” 可以快速安装。 1. Node.js (for ohpm) 2. ohpm 下载op的包管理&a…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
