天天看点

Unity3d编辑器拓展

http://blog.sina.com.cn/s/blog_471132920101n8cr.html

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院

                                                                                                Unity3d编辑器拓展

Unity Editor编辑器拓展一般用3个类

一 ScriptableObject ScriptableObject,继承自UnityEngine.Object,可用于在编辑器中存储数据,这里用于承载导航菜单栏的小功能。(无窗口)

一般有3步 1 类继承 ScriptableObject 2 静态函数前加[MenuItem("dir/name")] 3 在该函数里用Selection等处理

  1. using UnityEngine;  
  2. using UnityEditor;  
  3. using System.Collections;  
  4. public class AddChild : ScriptableObject  
  5. {  
  6.     [MenuItem ("LSY/Add Child ^n")]  
  7.     static void MenuAddChild()  
  8.     {  
  9.         Transform[] transforms = Selection.GetTransforms(SelectionMode.TopLevel | SelectionMode.OnlyUserModifiable);  
  10.         foreach(Transform transform in transforms)  
  11.         {  
  12.             GameObject newChild = new GameObject("_Child");  
  13.             newChild.transform.parent = transform;  
  14.         }  
  15.     }  
  16. }

二 EditorWindow

Unity3d编辑器拓展

用于自制窗口 继承自ScriptableObject,在UnityEditor命名空间下。 优点:可以加入Unity的排版。 缺点:容易处在其他窗口之后,看不见 一般有3步 1 类SomeClass继承 EditorWindow  类名即窗口名 2 静态函数前加[MenuItem("dir/name")],函数体内创建窗口 SomeClass   sc = (SomeClass) EditorWindow . GetWindow  ( typeof  ( SomeClass )); 3  OnGUI函数里写窗口结构   标签: GUILayout . Label  ( " Base Settings " ,  EditorStyles . boldLabel ); 填写框 myString = EditorGUILayout.TextField ("Text Field", myString); 滑动条 myFloat = EditorGUILayout.Slider ("Slider", myFloat, -3, 3); 单选框 myBool = EditorGUILayout.Toggle ("Toggle", myBool);

可选区域如下图,当勾选时,才能编辑ToggleGroup里的内容 groupEnabled  =  EditorGUILayout . BeginToggleGroup  ( " Optional Settings " ,  groupEnabled );

//content

EditorGUILayout . EndToggleGroup  ();

  1. using UnityEngine;
  2. using UnityEditor;
  3. public class MyWindow : EditorWindow {
  4.     string myString = "Hello World";
  5.     bool groupEnabled;
  6.     bool myBool = true;
  7.     float myFloat = 1.23f;
  8.     [MenuItem ("LSY/My Window")]
  9.     static void Init () {
  10.         // Get existing open window or if none, make a new one:
  11.         MyWindow window = (MyWindow)EditorWindow.GetWindow (typeof (MyWindow));
  12.     }
  13.     void OnGUI () {
  14.         GUILayout.Label ("Base Settings", EditorStyles.boldLabel);
  15.         myString = EditorGUILayout.TextField ("Text Field", myString);
  16.         groupEnabled = EditorGUILayout.BeginToggleGroup ("Optional Settings", groupEnabled);
  17.         myBool = EditorGUILayout.Toggle ("Toggle", myBool);
  18.         myFloat = EditorGUILayout.Slider ("Slider", myFloat, -3, 3);
  19.         EditorGUILayout.EndToggleGroup ();
  20.     }
  21. }

三 Editor

Unity3d编辑器拓展

用于自定义Inspector面板, 继承自ScriptableObject,在UnityEditor命名空间下。必须在起名为Editor的文件夹下。

如下代码。 1 第5行的MyMain 一定对应要修改面板的类 2 类名任意 3  override void   OnInspectorGUI (),  override 关键字必须有。 而里面的排版 组件和EditorWindow 一致。

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. [CustomEditor(typeof(MyMain))] 
  5. public class MyMainEditor:Editor {
  6.     public override void OnInspectorGUI() {
  7.         GUILayout.Label ("Base Settings", EditorStyles.boldLabel);
  8.         MyMain myTarget = (MyMain) target;
  9.         myTarget.coin = EditorGUILayout.IntSlider("Coins Num", myTarget.coin, 1, 10);
  10.         GUILayout.Button("OK");
  11.     }
  12. }

总结: 编辑器拓展。 基础类是ScriptableObject,配合MenuItem,能做基本选择处理 EditorWindow和Editor 相同点 1 均继承自ScriptableObject 2 组件均来自  GUILayout EditorGUILayout和EditorGUI。(GUILayout主要用到的是Label和Button) 不同点 1 EditorWindow是显示窗口,而Editor是做自定义Inspector

EditorGUILayout和EditorGUI的区别在于,EditorGUI是手动排版而EditorGUILayout是自动排版

最后简单介绍下ScriptableWizard,

Unity3d编辑器拓展

继承自EditorWindow。主要用来做向导。有2个按钮,一个是Create,另一个是Other,有兴趣的朋友可以看最后的参考文章。 OnWizardUpdate OnWizardCreate OnWizardOtherButton 优点:有定制功能,并且永远处于最上层显示 如果有EditorWindow想要最上层显示的话, 把继承EditorWindow直接换成 ScriptableWizard,把 MyWinClass window = ( MyWinClass )EditorWindow.GetWindow (typeof( MyWinClass )); 替换为

ScriptableWizard.DisplayWizard<</span> MyWinClass > ("Title"); 即可。

Reference: Unity3D之Editor扩展学习——四大名捕闹京东