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

文章目录

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

1 准备工作

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

csharp 复制代码
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() { }
}

2 提示窗口

2.1 双键窗口

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

csharp 复制代码
// 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);

​ 示例:

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

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

2.2 三键窗口

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

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

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

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

​ 示例:

csharp 复制代码
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 进度条窗口

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

csharp 复制代码
// 显示不可取消的进度条
// 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();

​ 示例:

csharp 复制代码
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 存储文件

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

csharp 复制代码
// 返回值:用户选择保存的文件路径
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 下不显示

​ 示例:

csharp 复制代码
private void OnGUI() {
    ...

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

3.2 选择文件夹

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

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

​ 示例:

csharp 复制代码
private void OnGUI() {
    ...

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

3.3 打开文件

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

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

​ 示例:

csharp 复制代码
private void OnGUI() {
    ...

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

3.4 打开文件夹

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

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

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

4 其他内容

4.1 压缩纹理

csharp 复制代码
public static void CompressTexture(
      Texture2D texture,
      TextureFormat format,
      TextureCompressionQuality quality);

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

4.2 查找对象依赖项

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

csharp 复制代码
public static extern UnityEngine.Object[] CollectDependencies([Unmarshalled] UnityEngine.Object[] roots);

​ 示例:

csharp 复制代码
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

相关推荐
我是唐青枫34 分钟前
C#.NET 范围与索引(Range、Index)完全解析:语法、用法与最佳实践
c#·.net
艾莉丝努力练剑2 小时前
【Python基础:语法第一课】Python 基础语法详解:变量、类型、动态特性与运算符实战,构建完整的编程基础认知体系
大数据·人工智能·爬虫·python·pycharm·编辑器
烛阴2 小时前
从`new()`到`.DoSomething()`:一篇讲透C#方法与构造函数的终极指南
前端·c#
skywalk81633 小时前
FreeBSD系统安装VSCode Server(未成功,后来是在FreeBSD系统里的Linux虚拟子系统里安装启动了Code Server)
ide·vscode·编辑器·freebsd
深海潜水员3 小时前
【MonoGame游戏开发】| 牧场物语实现 第一卷 : 农场基础实现 (下)
vscode·游戏·c#·.net·monogame
合作小小程序员小小店4 小时前
图书管理系统,基于winform+sql sever,开发语言c#,数据库mysql
开发语言·数据库·sql·microsoft·c#
大侠课堂14 小时前
C#经典面试题100道
开发语言·c#
时光追逐者16 小时前
Visual Studio 2026 现已正式发布,更快、更智能!
ide·c#·.net·visual studio
你还满意吗17 小时前
开发工具推荐
编辑器
周杰伦fans17 小时前
C# 正则表达式完全指南
mysql·正则表达式·c#