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

相关推荐
Mortal_hhh1 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
Envyᥫᩣ3 小时前
C#语言:从入门到精通
开发语言·c#
小春熙子7 小时前
Unity图形学之Shader结构
unity·游戏引擎·技术美术
IT技术分享社区9 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
Sitarrrr10 小时前
【Unity】ScriptableObject的应用和3D物体跟随鼠标移动:鼠标放置物体在场景中
3d·unity
极梦网络无忧10 小时前
Unity中IK动画与布偶死亡动画切换的实现
unity·游戏引擎·lucene
电子云与长程纠缠11 小时前
UE5.3中通过编辑器工具创建大纲菜单文件夹
java·ue5·编辑器
lucky九年12 小时前
vscode翻译插件
ide·vscode·编辑器
真·Wild·攻城狮13 小时前
【码农日常】Vscode Clangd初始化失败(Win10)
ide·vscode·编辑器
七灵微13 小时前
【测试】【Debug】vscode中同一个测试用例出现重复
ide·vscode·编辑器