Unity3d编辑器拓展

来源:互联网 发布:淘宝客贷怎么才能贷款 编辑:程序博客网 时间:2024/05/16 09:09

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.         
  11.         foreach(Transform transform in transforms)  
  12.         {  
  13.             GameObject newChild new GameObject("_Child");  
  14.             newChild.transform.parent transform;  
  15.         }  
  16.     }  
  17. }

二 EditorWindow
【风宇冲】Unity3d编辑器拓展
用于自制窗口
继承自ScriptableObject,在UnityEditor命名空间下。
优点:可以加入Unity的排版。
缺点:容易处在其他窗口之后,看不见
一般有3步
1 类SomeClass继承EditorWindow  类名即窗口名
2 静态函数前加[MenuItem("dir/name")],函数体内创建窗口
SomeClass  sc = (SomeClass)EditorWindow.GetWindow (typeof (SomeClass));
OnGUI函数里写窗口结构
  标签:GUILayout.Label ("Base Settings"EditorStyles.boldLabel);
填写框 myString EditorGUILayout.TextField ("Text Field"myString);
滑动条 myFloat EditorGUILayout.Slider ("Slider"myFloat-33);
单选框 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 nonemake a new one:
  11.         MyWindow window (MyWindow)EditorWindow.GetWindow (typeof (MyWindow));
  12.     }
  13.     
  14.     void OnGUI () {
  15.         GUILayout.Label ("Base Settings"EditorStyles.boldLabel);
  16.         myString EditorGUILayout.TextField ("Text Field"myString);
  17.         groupEnabled EditorGUILayout.BeginToggleGroup ("Optional Settings"groupEnabled);
  18.         myBool EditorGUILayout.Toggle ("Toggle"myBool);
  19.         myFloat EditorGUILayout.Slider ("Slider"myFloat-33);
  20.         EditorGUILayout.EndToggleGroup ();
  21.     }
  22. }

三 Editor
【风宇冲】Unity3d编辑器拓展
用于自定义Inspector面板,
继承自ScriptableObject,在UnityEditor命名空间下。必须在起名为Editor的文件夹下。

如下代码。
1 第5行的MyMain 一定对应要修改面板的类
2 类名任意
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 (MyMaintarget;
  9.         myTarget.coin EditorGUILayout.IntSlider("Coins Num"myTarget.coin110);
  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扩展学习——四大名捕闹京东
0 0
原创粉丝点击