ToB企服应用市场:ToB评测及商务社交产业平台

标题: 2024-06-08 Unity 编辑器开辟之编辑器拓展9 —— EditorUtility [打印本页]

作者: 来自云龙湖轮廓分明的月亮    时间: 2024-6-13 21:15
标题: 2024-06-08 Unity 编辑器开辟之编辑器拓展9 —— EditorUtility
1 准备工作

​ 创建脚本 “Lesson38Window.cs” 脚本,并将其放在 Editor 文件夹下。
  1. using UnityEditor;
  2. using UnityEngine;
  3. public class Lesson38Window : EditorWindow
  4. {
  5.     [MenuItem("Unity 编辑器拓展/Lesson38/EditorUtility 知识讲解")]
  6.     public static void Open() {
  7.         Lesson38Window win = GetWindow<Lesson38Window>();
  8.         win.Show();
  9.     }
  10.    
  11.     private void OnGUI() { }
  12. }
复制代码
2 提示窗口

2.1 双键窗口

​ 该方法表现窗口时会壅闭逻辑。
  1. // titile: 窗口标题名称。
  2. // message:窗口显示信息。
  3. // ok:     按钮 1 名称。
  4. // cancel: 按钮 2 名称。
  5. public static bool DisplayDialog(string title, string message, string ok);
  6. public static bool DisplayDialog(string title, string message, string ok, [UnityEngine.Internal.DefaultValue("""")] string cancel);
复制代码
​ 示例:
  1. private void OnGUI() {
  2.     if (GUILayout.Button("显示提示窗口")) {
  3.         if (EditorUtility.DisplayDialog("测试窗口", "确定要继续吗?", "确定", "取消")) {
  4.             Debug.Log("点击了确定");
  5.         }
  6.         else {
  7.             Debug.Log("点击了取消");
  8.         }
  9.         Debug.Log("窗口显示完毕");
  10.     }
  11. }
复制代码
2.2 三键窗口

​ 该方法表现窗口时也会壅闭逻辑。
  1. public static int DisplayDialogComplex(
  2.       string title,   // 窗口标题名称
  3.       string message, // 窗口显示信息
  4.       string ok,      // 按钮 1 名称
  5.       string cancel,  // 按钮 2 名称
  6.       string alt);    // 按钮 3 名称
复制代码
​ 返回值需要留意,不是顺序返回:

​ 示例:
  1. private void OnGUI() {
  2.     ...
  3.     if (GUILayout.Button("显示三键提示窗口")) {
  4.         var result = EditorUtility.DisplayDialogComplex("三键显示", "显示信息", "选项1", "关闭", "选项2");
  5.         switch (result) {
  6.             case 0:
  7.                 Debug.Log("点击了选项1");
  8.                 break;
  9.             case 1:
  10.                 Debug.Log("点击了关闭");
  11.                 break;
  12.             case 2:
  13.                 Debug.Log("点击了选项2");
  14.                 break;
  15.         }
  16.     }
  17. }
复制代码
2.3 进度条窗口

​ 进度条窗口不会卡逻辑,但是需要配合关闭进度条利用。
  1. // 显示不可取消的进度条
  2. // titile:  窗口标题名称。
  3. // info:    窗口显示信息。
  4. // progress:当前进度,0~1。
  5. public static extern void DisplayProgressBar(string title, string info, float progress);
  6. // 显示可取消的进度条
  7. // 返回值:用户是否按下了取消按钮
  8. public static extern bool DisplayCancelableProgressBar(string title, string info, float progress);
  9. // 关闭进度条
  10. public static extern void ClearProgressBar();
复制代码
​ 示例:
  1. public class Lesson38Window : EditorWindow
  2. {
  3.     private float _progressValue = 0;
  4.    
  5.     ...
  6.     private void OnGUI() {
  7.         ...
  8.             
  9.         if (GUILayout.Button("显示更新进度条")) {
  10.             _progressValue += 0.1f;
  11.             EditorUtility.DisplayProgressBar("进度条标题", "进度条窗口显示内容", _progressValue);
  12.             Debug.Log("进度条窗口显示完毕");
  13.         }
  14.         
  15.         if (GUILayout.Button("关闭进度条")) {
  16.             _progressValue = 0;
  17.             EditorUtility.ClearProgressBar();
  18.         }
  19.     }
  20. }
复制代码
3 文件面板

3.1 存储文件

​ 通常用于在编辑器中保存新创建的文件或选择文件的保存路径。
  1. // 返回值:用户选择保存的文件路径
  2. public static extern string SaveFilePanel(
  3.       string title,       // 窗口标题
  4.       string directory,   // 打开的目录路径
  5.       string defaultName, // 默认保存的文件名称
  6.       string extension);  // 文件后缀名
  7. // 只允许用户选择项目内的文件夹作为保存路径
  8. public static string SaveFilePanelInProject(
  9.       string title,       // 窗口标题
  10.       string defaultName, // 默认保存的文件名称
  11.       string extension,   // 文件后缀名
  12.       string message);    // 在对话框窗口中显示的文本摘要,Windows 下不显示
复制代码
​ 示例:
  1. private void OnGUI() {
  2.     ...
  3.     if (GUILayout.Button("打开文件存储面板")) {
  4.         var str = EditorUtility.SaveFilePanel("打开我的文件", Application.dataPath, "test", "txt"); // 获取用户选择的保存路径
  5.         if (str != "") // 如果用户取消选择,则 str 为空字符串,需要进行判断
  6.             File.WriteAllText(str, "Hello World"); // 手动操作,写入文件内容
  7.     }
  8. }
复制代码
3.2 选择文件夹

​ 通常用于在编辑器中选择文件夹作为保存路径,用于保存文件或实行其他与文件夹相关的操作。
  1. // title:      窗口标题
  2. // folder:     默认打开的文件夹
  3. // defaultName:默认名称
  4. public static extern string SaveFolderPanel(string title, string folder, string defaultName);
复制代码
​ 示例:
  1. private void OnGUI() {
  2.     ...
  3.     if (GUILayout.Button("显示文件夹存储面板")) {
  4.         var str = EditorUtility.SaveFolderPanel("得到一个存储路径(文件夹)", "", "test");
  5.         Debug.Log(str);
  6.     }
  7. }
复制代码
3.3 打开文件

​ 通常用于在编辑器中选择文件进行打开或实行其他与文件相关的操作。
  1. // title:    窗口标题
  2. // directory:默认打开的文件夹
  3. // extension:文件后缀名
  4. public static extern string OpenFilePanel(string title, string directory, string extension);
复制代码
​ 示例:
  1. private void OnGUI() {
  2.     ...
  3.     if (GUILayout.Button("显示打开文件面板")) {
  4.         var str = EditorUtility.OpenFilePanel("得到一个文件路径", Application.dataPath, "txt");
  5.         if (str != "") {
  6.             Debug.Log(File.ReadAllText(str));
  7.         }
  8.     }
  9. }
复制代码
3.4 打开文件夹

​ 通常用于在编辑器中选择文件夹进行打开或实行其他与文件夹相关的操作。
  1. // title:      窗口标题
  2. // folder:     默认打开的文件夹
  3. // defaultName:默认名称
  4. public static extern string OpenFolderPanel(string title, string folder, string defaultName);
复制代码
​ 和 SaveFolderPanel 功能雷同,都是获取一个文件夹路径。
4 其他内容

4.1 压缩纹理

  1. public static void CompressTexture(
  2.       Texture2D texture,
  3.       TextureFormat format,
  4.       TextureCompressionQuality quality);
复制代码
​ 将纹理显式压缩为指定的格式,之后会配合资源导入相关内容利用。
4.2 查找对象依靠项

​ 返回对象所依靠的全部资源列表。
  1. public static extern UnityEngine.Object[] CollectDependencies([Unmarshalled] UnityEngine.Object[] roots);
复制代码
​ 示例:
  1. using System.IO;
  2. using UnityEditor;
  3. using UnityEngine;
  4. using Object = UnityEngine.Object;
  5. public class Lesson38Window : EditorWindow
  6. {
  7.     public GameObject obj;
  8.    
  9.     ...
  10.     private void OnGUI() {
  11.         ...
  12.         
  13.         obj = EditorGUILayout.ObjectField("关联对象", obj, typeof(GameObject), true) as GameObject;
  14.         if (GUILayout.Button("检索关联对象")) {
  15.             var objs = EditorUtility.CollectDependencies(new Object[] { obj });
  16.             Selection.objects = objs;
  17.         }
  18.     }
  19. }
复制代码
  更多内容:https://docs.unity3d.com/ScriptReference/EditorUtility.html

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4