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

相关推荐
Death2001 小时前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
Death2002 小时前
Qt 3D、QtQuick、QtQuick 3D 和 QML 的关系
c语言·c++·qt·3d·c#
yufei-coder2 小时前
C#基础语法
开发语言·c#·.net
yngsqq2 小时前
031集——文本文件按空格分行——C#学习笔记
笔记·学习·c#
XiaoLiuLB3 小时前
ChatGPT Canvas:交互式对话编辑器
人工智能·自然语言处理·chatgpt·编辑器·aigc
新手unity自用笔记17 小时前
项目-坦克大战学习-子弹的移动与销毁
笔记·学习·c#
五花肉村长18 小时前
数据结构-队列
c语言·开发语言·数据结构·算法·visualstudio·编辑器
qinzechen18 小时前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#
嵌入式小能手19 小时前
开发环境搭建之VScode的安装及使用
vscode·编辑器
Artistation Game19 小时前
九、怪物行为逻辑
游戏·unity·游戏引擎