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


    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

  • 相关阅读:
    Springboot + screw 数据库快速开发文档
    Go微服务框架go-kratos实战04:kratos中服务注册和服务发现的使用
    海外代理IP是什么?如何使用?
    Linux - make命令 和 makefile
    密码学-SHA-1算法
    Vue源码系列讲解——生命周期篇【一】(综述)
    java基于Android校园闲置资料共享系统uniapp小程序
    什么密码,永远无法被黑客攻破?
    1认识一下防火墙
    rte_mempool_get
  • 原文地址:https://blog.csdn.net/zheliku/article/details/139549856