当前位置:   article > 正文

Unity Editor 基础篇(九):EditorUtility编辑器工具

editorutility

EditorUtility 编辑器工具

转自:http://blog.csdn.net/liqiangeastsun/article/details/42174339,请查看原文,尊重楼主原创版权。

这是一个编辑器类,如果想使用它你需要把它放到工程目录下的Assets/Editor文件夹下。

编辑器类在UnityEditor命名空间下。所以当使用C#脚本时,你需要在脚本前面加上 "using UnityEditor"引用。

1.ProgressBar 进度条

在Editor文件夹中添加脚本:

 

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. public class TestEditor : EditorWindow
  5. {
  6. float secs = 10.0f;
  7. double startVal = 0;
  8. double progress = 0;
  9. bool isShow = false;
  10. [MenuItem("Examples/Cancelable Progress Bar Usage")]
  11. static void Init()
  12. {
  13. var window = GetWindow(typeof(TestEditor));
  14. window.Show();
  15. }
  16. void OnGUI()
  17. {
  18. secs = EditorGUILayout.FloatField("Time to wait:", secs);
  19. if (GUILayout.Button("Display bar"))
  20. {
  21. startVal = EditorApplication.timeSinceStartup; //开始编译到现在的时间
  22. isShow = !isShow;
  23. }
  24. if (GUILayout.Button("Clear bar"))
  25. {
  26. EditorUtility.ClearProgressBar(); //清空进度条的值, 基本没什么用
  27. }
  28. if (progress < secs && isShow == true)
  29. {
  30. //使用这句代码,在进度条后边会有一个 关闭按钮,但是用这句话会直接卡死,切记不要用
  31. // EditorUtility.DisplayCancelableProgressBar("Simple Progress Bar", "Show a progress bar for the given seconds", (float)(progress / secs));
  32. //使用这句创建一个进度条, 参数1 为标题,参数2为提示,参数3为 进度百分比 0~1 之间
  33. EditorUtility.DisplayProgressBar("Simple Progress Bar", "Show a progress bar for the given seconds", (float)(progress / secs));
  34. }
  35. else {
  36. startVal = EditorApplication.timeSinceStartup;
  37. progress = 0.0f;
  38. return;
  39. }
  40. progress = EditorApplication.timeSinceStartup - startVal;
  41. }
  42. void OnInspectorUpdate() //更新
  43. {
  44. Repaint(); //重新绘制
  45. }
  46. }

 

效果:

 

 

2.CollectDeepHierarchy收集深度层级

 

 

遍历对象以及子物体,以及子物体上绑定的所有组件

 

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. public class Test : MonoBehaviour { //遍历对象以及子物体,以及子物体上绑定的所有组件
  5. private GameObject parent;
  6. // Use this for initialization
  7. void Start () {
  8. Init();
  9. }
  10. void Init()
  11. {
  12. parent = gameObject; // 给parent赋值 为 gameObject ,在Hierarchy 中给该对象创建几个子物体
  13. Object[] obj = new Object[1];
  14. obj[0] = parent; //将parent添加至 数组
  15. Object[] result = EditorUtility.CollectDeepHierarchy(obj);
  16. foreach (Object ob in result) //遍历 所有对象,得到对象本身包括子对象上绑定的所有组件
  17. {
  18. print(ob + " " + ob.name); //
  19. }
  20. }
  21. }


3.CompressTexture压缩一个纹理到指定的格式

 

 

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. public class Test : AssetPostprocessor { //
  5. void OnPostprocessTexture(Texture2D T) //使用该方法压缩一个纹理到指定的格式
  6. {
  7. //该方法需使用 Texture2D, 使用该方法比较快速但是会降低效果
  8. EditorUtility.CompressTexture(T, TextureFormat.RGB24, TextureCompressionQuality.Best);
  9. }
  10. }

 

 

4.CreateGameObjectWithHideFlags 创建带有标识的游戏物体

在Editor文件夹下创建脚本:

 

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. public class TestEditor : EditorWindow
  5. {
  6. private string objName = "GameObject";
  7. private int instanceID = 0;
  8. private bool create = true;
  9. private GameObject go = null;
  10. private bool hideHierarchy = true;
  11. [MenuItem("Examples/GameObject flags")]
  12. static void Init()
  13. {
  14. TestEditor window = (TestEditor)GetWindow(typeof(TestEditor)); //初始化一个窗口
  15. window.Show();
  16. }
  17. void OnGUI()
  18. {
  19. create = EditorGUILayout.Toggle("Create a GO:", create); //在窗口创建一个 Toggle
  20. GUI.enabled = create; //GUI是否可以创建
  21. objName = EditorGUILayout.TextField("GameObject Name:", objName); //创建文本框
  22. if (GUILayout.Button("Create")) //创建按钮
  23. { //点击按钮,创建一个GameObject
  24. GameObject created = EditorUtility.CreateGameObjectWithHideFlags(
  25. objName,
  26. hideHierarchy ? HideFlags.HideInHierarchy : 0);
  27. //HideFlags.HideInHierarchy 对象在Hierarchy 窗口隐藏
  28. //HideFlags.HideInInspector 对象在Hierarchy窗口可见,点击该对象,在Inspector面板不显示任何属性
  29. GameObject ccc = EditorUtility.CreateGameObjectWithHideFlags("cccc", HideFlags.HideInInspector);
  30. Debug.Log("Created GameObject ID: " + created.GetInstanceID());
  31. }
  32. GUI.enabled = !create;
  33. EditorGUILayout.BeginHorizontal(); //开始水平布局
  34. instanceID = EditorGUILayout.IntField("Instance ID:", instanceID); //创建一个 整数输入框
  35. if (GUILayout.Button("Search & Update flags")) //创建一个按钮,更新flags
  36. {
  37. go = null;
  38. go = (GameObject)EditorUtility.InstanceIDToObject(instanceID); //给该对象实例化一个ID
  39. if (go)
  40. go.hideFlags = hideHierarchy ? HideFlags.HideInHierarchy : 0;
  41. }
  42. EditorGUILayout.EndHorizontal(); //结束水平布局
  43. if (!go)
  44. EditorGUILayout.LabelField("Object: ", "No object was found");
  45. else
  46. EditorGUILayout.LabelField("Object: ", go.name);
  47. GUI.enabled = true;
  48. hideHierarchy = EditorGUILayout.Toggle("HideInHierarchy", hideHierarchy); //创建一个Toggle ,
  49. }
  50. }

 

 

效果:

Unity在菜单栏创建按钮,点击按钮创建一个窗口,在窗口上创建 Toggle、TextField、button等, 在窗口创建了一个Create按钮,点击按钮创建对象

勾选 Create a Go: 的Toggle,显示Create按钮
点击Create按钮,在 Hierarchy 窗口创建 对象“aaa” “ccc”

选中 “aaa”,Inspector窗口如下所示

 

选中 “cccc” 在,Inspector窗口如下所示,”cccc“绑定的组件在Inspector面板隐藏


5.DisplayDialog显示对话框  DisplayDialogComplex 显示复杂对话框

用于在编辑器显示消息框。

1/ DisplayDialog显示对话框(返回true/false)

ok 和 cancel 是显示在对话框按钮上的标签,如果cancel为空(默认),然只有一个按钮被显示。如果ok按钮被按下,DisplayDialog返回true。

 

 

  1. //在地形的表面上放置选择的物体。
  2. using UnityEngine;
  3. using UnityEditor;
  4. public class PlaceSelectionOnSurface : ScriptableObject {
  5. [MenuItem ("Example/Place Selection On Surface")]
  6. static void CreateWizard () {
  7. Transform[] transforms = Selection.GetTransforms(SelectionMode.Deep |
  8. SelectionMode.ExcludePrefab | SelectionMode.OnlyUserModifiable);
  9. if (transforms.Length > 0 &&
  10. EditorUtility.DisplayDialog("Place Selection On Surface?",
  11. "Are you sure you want to place " + transforms.Length
  12. + " on the surface?", "Place", "Do Not Place")) {
  13. foreach (Transform transform in transforms) {
  14. RaycastHit hit;
  15. if (Physics.Raycast(transform.position, Vector3.down, out hit)) {
  16. transform.position = hit.point;
  17. Vector3 randomized = Random.onUnitSphere;
  18. randomized = new Vector3(randomized.x, 0F, randomized.z);
  19. transform.rotation = Quaternion.LookRotation(randomized, hit.normal);
  20. }
  21. }
  22. }
  23. }
  24. }

 

 

 

2/ DisplayDialogComplex 显示复杂对话框(返回0/1/2对应ok/cancel/alt)

  1. //让你保存,保存并退出或退出不保存
  2. class EditorUtilityDisplayDialogComplex extends MonoBehaviour {
  3. @MenuItem("Examples/Enhanced Save")
  4. static function Init() {
  5. var option = EditorUtility.DisplayDialogComplex(
  6. "What do you want to do?",
  7. "Please choose one of the following options.",
  8. "Save Scene",
  9. "Save and Quit",
  10. "Quit without saving");
  11. switch (option) {
  12. // Save Scene //保存场景
  13. case 0:
  14. EditorApplication.SaveScene(EditorApplication.currentScene);
  15. break;
  16. // Save and Quit. //保存并退出
  17. case 1:
  18. EditorApplication.SaveScene(EditorApplication.currentScene);
  19. EditorApplication.Exit(0);
  20. break;
  21. // Quit Without saving. // 退出不保存
  22. case 2:
  23. EditorApplication.Exit(0);
  24. break;
  25. default:
  26. Debug.LogError("Unrecognized option.");
  27. }
  28. }
  29. }


6.DisplayPopupMenu显示弹出菜单

 

static function DisplayPopupMenu (position : Rect, menuItemPath : string, command : MenuCommand) : void

 

菜单显示在position位置,从menuItemPath指定的子菜单生成,使用MenuCommand作为菜单上下文。

 

  1. 在Editor文件夹下创建脚本TestEditor
  2. using UnityEngine;
  3. using System.Collections;
  4. using UnityEditor;
  5. public class TestEditor : EditorWindow
  6. {
  7. [MenuItem("Examples/Enhanced Save")]
  8. static void Init()
  9. {
  10. Rect contextRect = new Rect(10, 10, 100, 100);
  11. EditorUtility.DisplayPopupMenu(contextRect, "Assets/", null);
  12. }
  13. }


在工具栏创建Button点击Button,在Asset下创建窗口

 

 

 

双击“Enbanced Save”显示如下窗口,即Asset下创建窗口

 

7.FocusProjectWindow焦点项目窗口

使项目窗口到前面并焦点它,这个通常在一个菜单项创建并选择一个资源之后被调用。

 

8.SaveFilePanel保存文件面板

SaveFolderPanel 保存文件夹面板

Unity编辑器之导入导出获取路径对话框:

 

选中一个图片,点击 “Save Texture to file”按钮:

 

 

  1. 在Editor文件夹下创建脚本
  2. using UnityEngine;
  3. using System.Collections;
  4. using UnityEditor;
  5. using System.IO;
  6. public class TestEditor : EditorWindow
  7. {
  8. [MenuItem("Examples/Save Texture to file")]
  9. static void Apply()
  10. {
  11. Texture2D texture = Selection.activeObject as Texture2D; //选中一个图片
  12. if (texture == null)
  13. { //如果没选图片,显示提示对话框
  14. EditorUtility.DisplayDialog(
  15. "Select Texture",
  16. "You Must Select a Texture first!",
  17. "Ok");
  18. return;
  19. }
  20. //获取路径
  21. string path = EditorUtility.SaveFilePanel(
  22. "Save texture as PNG",
  23. "",
  24. texture.name + ".png",
  25. "png");
  26. if (path.Length != 0)
  27. {
  28. // Convert the texture to a format compatible with EncodeToPNG
  29. if (texture.format != TextureFormat.ARGB32 && texture.format != TextureFormat.RGB24)
  30. {
  31. Texture2D newTexture = new Texture2D(texture.width, texture.height);
  32. newTexture.SetPixels(texture.GetPixels(0), 0);
  33. texture = newTexture;
  34. }
  35. var pngData = texture.EncodeToPNG();
  36. if (pngData != null)
  37. File.WriteAllBytes(path, pngData);
  38. }
  39. }
  40. }

 

 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号