2024-06-08 Unity 编辑器开发之编辑器拓展9 —— EditorUtility

news2025/2/23 1:36:43

文章目录

  • 1 准备工作
  • 2 提示窗口
    • 2.1 双键窗口
    • 2.2 三键窗口
    • 2.3 进度条窗口
  • 3 文件面板
    • 3.1 存储文件
    • 3.2 选择文件夹
    • 3.3 打开文件
    • 3.4 打开文件夹
  • 4 其他内容
    • 4.1 压缩纹理
    • 4.2 查找对象依赖项

1 准备工作

​ 创建脚本 “Lesson38Window.cs” 脚本,并将其放在 Editor 文件夹下。

using UnityEditor;
using UnityEngine;

public class Lesson38Window : EditorWindow
{
    [MenuItem("Unity 编辑器拓展/Lesson38/EditorUtility 知识讲解")]
    public static void Open() {
        Lesson38Window win = GetWindow<Lesson38Window>();
        win.Show();
    }
    
    private void OnGUI() { }
}
image-20240607193440480

2 提示窗口

2.1 双键窗口

​ 该方法显示窗口时会阻塞逻辑。

// titile: 窗口标题名称。
// message:窗口显示信息。
// ok:     按钮 1 名称。
// cancel: 按钮 2 名称。
public static bool DisplayDialog(string title, string message, string ok);
public static bool DisplayDialog(string title, string message, string ok, [UnityEngine.Internal.DefaultValue("\"\"")] string cancel);

​ 示例:

image-20240607194153059
private void OnGUI() {
    if (GUILayout.Button("显示提示窗口")) {
        if (EditorUtility.DisplayDialog("测试窗口", "确定要继续吗?", "确定", "取消")) {
            Debug.Log("点击了确定");
        }
        else {
            Debug.Log("点击了取消");
        }

        Debug.Log("窗口显示完毕");
    }
}

2.2 三键窗口

​ 该方法显示窗口时也会阻塞逻辑。

public static int DisplayDialogComplex(
      string title,   // 窗口标题名称
      string message, // 窗口显示信息
      string ok,      // 按钮 1 名称
      string cancel,  // 按钮 2 名称
      string alt);    // 按钮 3 名称

​ 返回值需要注意,不是顺序返回:

  • 0:按钮 1 按下。
  • 1:按钮 3 按下。
  • 2:按钮 2 按下。

​ 示例:

image-20240607194803038
private void OnGUI() {
    ...

    if (GUILayout.Button("显示三键提示窗口")) {
        var result = EditorUtility.DisplayDialogComplex("三键显示", "显示信息", "选项1", "关闭", "选项2");
        switch (result) {
            case 0:
                Debug.Log("点击了选项1");
                break;
            case 1:
                Debug.Log("点击了关闭");
                break;
            case 2:
                Debug.Log("点击了选项2");
                break;
        }
    }
}

2.3 进度条窗口

​ 进度条窗口不会卡逻辑,但是需要配合关闭进度条使用。

// 显示不可取消的进度条
// titile:  窗口标题名称。
// info:    窗口显示信息。
// progress:当前进度,0~1。
public static extern void DisplayProgressBar(string title, string info, float progress);
// 显示可取消的进度条
// 返回值:用户是否按下了取消按钮
public static extern bool DisplayCancelableProgressBar(string title, string info, float progress);

// 关闭进度条
public static extern void ClearProgressBar();

​ 示例:

image-20240608181712643
public class Lesson38Window : EditorWindow
{
    private float _progressValue = 0;
    
    ...

    private void OnGUI() {
        ...
            
        if (GUILayout.Button("显示更新进度条")) {
            _progressValue += 0.1f;
            EditorUtility.DisplayProgressBar("进度条标题", "进度条窗口显示内容", _progressValue);
            Debug.Log("进度条窗口显示完毕");
        }
        
        if (GUILayout.Button("关闭进度条")) {
            _progressValue = 0;
            EditorUtility.ClearProgressBar();
        }
    }
}

3 文件面板

3.1 存储文件

​ 通常用于在编辑器中保存新创建的文件或选择文件的保存路径。

// 返回值:用户选择保存的文件路径
public static extern string SaveFilePanel(
      string title,       // 窗口标题
      string directory,   // 打开的目录路径
      string defaultName, // 默认保存的文件名称
      string extension);  // 文件后缀名

// 只允许用户选择项目内的文件夹作为保存路径
public static string SaveFilePanelInProject(
      string title,       // 窗口标题
      string defaultName, // 默认保存的文件名称
      string extension,   // 文件后缀名
      string message);    // 在对话框窗口中显示的文本摘要,Windows 下不显示

​ 示例:

image-20240608184644919
private void OnGUI() {
    ...

    if (GUILayout.Button("打开文件存储面板")) {
        var str = EditorUtility.SaveFilePanel("打开我的文件", Application.dataPath, "test", "txt"); // 获取用户选择的保存路径
        if (str != "") // 如果用户取消选择,则 str 为空字符串,需要进行判断
            File.WriteAllText(str, "Hello World"); // 手动操作,写入文件内容
    }
}

3.2 选择文件夹

​ 通常用于在编辑器中选择文件夹作为保存路径,用于保存文件或执行其他与文件夹相关的操作。

// title:      窗口标题
// folder:     默认打开的文件夹
// defaultName:默认名称
public static extern string SaveFolderPanel(string title, string folder, string defaultName);

​ 示例:

image-20240608191141899
private void OnGUI() {
    ...

    if (GUILayout.Button("显示文件夹存储面板")) {
        var str = EditorUtility.SaveFolderPanel("得到一个存储路径(文件夹)", "", "test");
        Debug.Log(str);
    }
}

3.3 打开文件

​ 通常用于在编辑器中选择文件进行打开或执行其他与文件相关的操作。

// title:    窗口标题
// directory:默认打开的文件夹
// extension:文件后缀名
public static extern string OpenFilePanel(string title, string directory, string extension);

​ 示例:

image-20240608191540375
private void OnGUI() {
    ...

    if (GUILayout.Button("显示打开文件面板")) {
        var str = EditorUtility.OpenFilePanel("得到一个文件路径", Application.dataPath, "txt");
        if (str != "") {
            Debug.Log(File.ReadAllText(str));
        }
    }
}

3.4 打开文件夹

​ 通常用于在编辑器中选择文件夹进行打开或执行其他与文件夹相关的操作。

// title:      窗口标题
// folder:     默认打开的文件夹
// defaultName:默认名称
public static extern string OpenFolderPanel(string title, string folder, string defaultName);

​ 和 SaveFolderPanel 功能类似,都是获取一个文件夹路径。

4 其他内容

4.1 压缩纹理

public static void CompressTexture(
      Texture2D texture,
      TextureFormat format,
      TextureCompressionQuality quality);

​ 将纹理显式压缩为指定的格式,之后会配合资源导入相关内容使用。

4.2 查找对象依赖项

​ 返回对象所依赖的所有资源列表。

public static extern UnityEngine.Object[] CollectDependencies([Unmarshalled] UnityEngine.Object[] roots);

​ 示例:

image-20240608193430329 image-20240608193508749
using System.IO;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;

public class Lesson38Window : EditorWindow
{
    public GameObject obj;
    
    ...

    private void OnGUI() {
        ...
        
        obj = EditorGUILayout.ObjectField("关联对象", obj, typeof(GameObject), true) as GameObject;
        if (GUILayout.Button("检索关联对象")) {
            var objs = EditorUtility.CollectDependencies(new Object[] { obj });
            Selection.objects = objs;
        }
    }
}

更多内容:https://docs.unity3d.com/ScriptReference/EditorUtility.html

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

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

相关文章

构建数字社会:Web3时代的社会治理与价值重构

随着数字化技术的飞速发展&#xff0c;我们正逐渐迈入Web3时代&#xff0c;这是一个以去中心化、开放性和透明性为特征的新时代。在这个时代&#xff0c;数字技术将不仅仅改变我们的生活方式和商业模式&#xff0c;还将对社会治理和价值观念产生深远影响。本文将探讨Web3时代下…

分享一个按钮代码,主要有html,svg及css动画实现

按钮展示: Switch by Galahhad made with CSS | Uiverse.io 源代码: css .theme-switch {--toggle-size: 30px;/* the size is adjusted using font-size,this is not transform scale,so you can choose any size */--container-width: 5.625em;--container-height: 2.5em;-…

Docker配置Redis集群以及主从扩容与缩容

基础镜像拉取 docker run -p 6379:6379 -d redis:6.0.8 配置文件以及数据卷挂载 # 开启密码验证&#xff08;可选&#xff09; requirepass 1234 # 允许redis外地连接&#xff0c;需要注释掉绑定的IP # bind 127.0.0.1 # 关闭保护模式&#xff08;可选&#xff09; protected-m…

Rust : windows下protobuf尝试

此前dbpystream库是用python开发 web api。今天在rust中试用一下protobuf。 一、 protobuf编译器下载 具体见相关文章。没有编译器&#xff0c;protobuf无法运行。 windows参见&#xff1a; https://blog.csdn.net/wowotuo/article/details/139458846?spm1001.2014.3001.550…

Elasticsearch:基于多个 kNN 字段对文档进行评分

作者&#xff1a;来自 Elastic Madhusudhan Konda 通过具有多个 kNN 字段的最接近的文档对文档进行评分 Elasticsearch 不仅仅是一个词法&#xff08;文本&#xff09;搜索引擎。 Elasticsearch 是多功能搜索引擎&#xff0c;除了传统的文本匹配之外&#xff0c;还支持 k 最近…

云计算期末复习(3)

Amazon云计算 习题 私有IP、公有IP和弹性IP的区别在哪里? EC2的实例一旦被创建就会动态地分配公共IP地址和私有IP地址。私有IP地址由动态主机配置协议(DHCP)分配产生。 私有IP、公有IP和弹性IP的主要区别在于它们的使用场景、可达性和管理方式&#xff1a; 私有IP&#xff1a…

Linux内核epoll

Linux网络IO模型 同步和异步&#xff0c;阻塞和非阻塞 Linux下的五种IO模型 同步和异步&#xff0c;阻塞和非阻塞 Linux 下的五种I/O模型&#xff1a; 阻塞IO&#xff08;Blocking IO&#xff09; BIO 非阻塞IO&#xff08;No Blocking IO&#xff09; IO复用&#xff08;se…

【录制,纯正人声】OBS录制软件,音频电流音,杂音解决办法,录制有噪声的解决办法

速度解决的方法 &#xff08;1&#xff09;用RNNoise去除噪声。RNNoise是一个开源的&#xff0c;效果不好的噪声去除器。使用方法就是点击滤镜&#xff0c;然后加噪声抑制RNNoise。【这方法不好用】 &#xff08;2&#xff09;用Krisp(https://krisp.ai/) 去除噪声。这个Kris…

2024年【起重机械指挥】考试及起重机械指挥新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械指挥考试考前必练&#xff01;安全生产模拟考试一点通每个月更新起重机械指挥新版试题题目及答案&#xff01;多做几遍&#xff0c;其实通过起重机械指挥试题及解析很简单。 1、【多选题】《中华人民共和国特…

Django框架中Ajax GET与POST请求的实战应用

系列文章目录 以下几篇侧重点为JavaScript内容0.0 JavaScript入门宝典&#xff1a;核心知识全攻略&#xff08;上&#xff09;JavaScript入门宝典&#xff1a;核心知识全攻略&#xff08;下&#xff09;Django框架中Ajax GET与POST请求的实战应用VSCode调试揭秘&#xff1a;L…

详解 Flink 的时间语义和 watermark

一、Flink 时间语义类型 Event Time&#xff1a;是事件创建的时间。它通常由事件中的时间戳描述&#xff0c;例如采集的日志数据中&#xff0c;每一条日志都会记录自己的生成时间&#xff0c;Flink 通过时间戳分配器访问事件时间戳Ingestion Time &#xff1a;是数据进入 Flink…

✔️Vue基础+

✔️Vue基础 文章目录 ✔️Vue基础computed methods watchcomputed计算属性methods计算属性computed计算属性 VS methods方法计算属性的完整写法 watch侦听器&#xff08;监视器&#xff09;watch侦听器 Vue生命周期Vue生命周期钩子 工程化开发和脚手架脚手架Vue CLI 项目目录介…

基于Python的北京天气数据可视化分析

项目用到库 import numpy as np import pandas as pd import datetime from pyecharts.charts import Line from pyecharts.charts import Boxplot from pyecharts.charts import Pie,Grid from pyecharts import options as opts from pyecharts.charts import Calendar 1.2…

【数据结构】栈的应用

目录 0 引言 1 栈在括号匹配中的应用 2 栈在表达式求值中的应用 2.1 算数表达式 2.2 中缀表达式转后缀表达式 2.3 后缀表达式求值 3 栈在递归中的应用 3.1 栈在函数调用中的作用 3.2 栈在函数调用中的工作原理 4 总结 0 引言 栈&#xff08;Stack&#xff09;是一…

Python001

Python 是一种高级编程语言。它具有以下显著特点&#xff1a;1. 简单易学&#xff1a;语法相对简洁明了&#xff0c;对初学者很友好。2. 丰富的库&#xff1a;拥有大量强大的内置库和第三方库&#xff0c;可用于各种领域&#xff0c;如数据分析、机器学习、Web 开发等。3. 可读…

Python应用开发——30天学习Streamlit Python包进行APP的构建(5)

上几次我们已经将一些必备的内容进行了快速的梳理,让我们掌握了streanlit的凯快速上手,接下来我们将其它的一些基础函数再做简单的梳理,以顺便回顾我们未来可能用到的更丰富的函数来实现应用的制作。 st.write_stream 将生成器、迭代器或类似流的序列串流到应用程序中。 …

【网络编程开发】8.TCP连接管理与UDP协议 9.IP协议与ethernet协议

8.TCP连接管理与UDP协议 三次握手 三次握手的过程在TCP/IP网络通信中起着至关重要的作用&#xff0c;它不仅确保了数据的可靠传输&#xff0c;还为两端的数据传输提供了稳定的连接初始化过程。这一过程涉及到几个关键步骤&#xff0c;每个步骤都有其特定的目的和功能。 步骤&…

你可以直接和数据库对话了!DB-GPT 用LLM定义数据库下一代交互方式,数据库领域的GPT、开启数据3.0 时代

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 你可以直接和数据库对话了&#xff01;DB-GPT 用LLM定义数据库下一代交互方式&#xff0c;数据库领…

前端开发高频面试题

好的&#xff0c;以下是对您提出的问题的详细回答&#xff1a; 说说vue动态权限绑定渲染列表&#xff08;权限列表渲染&#xff09; Vue中动态权限绑定渲染列表通常涉及以下步骤&#xff1a; 首先&#xff0c;通过API请求从服务器获取当前用户的权限数据。在Vue组件中&#xff…

Excel 生成所在月份的每一天列表

Excel 的 A2 格是日期 A1Fecha201/03/24 需要生成该日期所在月份的每一天的列表 A1WholeMonth201/03/24302/03/24403/03/24504/03/24605/03/24706/03/24807/03/24908/03/241009/03/241110/03/241211/03/241312/03/241413/03/241514/03/241615/03/241716/03/241817/03/241918…