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等处理
- using UnityEngine;
- using UnityEditor;
- using System.Collections;
- public class AddChild : ScriptableObject
- {
- [MenuItem ("LSY/Add Child ^n")]
- static void MenuAddChild()
- {
- Transform[] transforms = Selection.GetTransforms(SelectionMode.TopLevel | SelectionMode.OnlyUserModifiable);
- foreach(Transform transform in transforms)
- {
- GameObject newChild = new GameObject("_Child");
- newChild.transform.parent = transform;
- }
- }
- }
二 EditorWindow
用于自制窗口 继承自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 ();
- using UnityEngine;
- using UnityEditor;
- public class MyWindow : EditorWindow {
- string myString = "Hello World";
- bool groupEnabled;
- bool myBool = true;
- float myFloat = 1.23f;
- [MenuItem ("LSY/My Window")]
- static void Init () {
- // Get existing open window or if none, make a new one:
- MyWindow window = (MyWindow)EditorWindow.GetWindow (typeof (MyWindow));
- }
- void OnGUI () {
- GUILayout.Label ("Base Settings", EditorStyles.boldLabel);
- myString = EditorGUILayout.TextField ("Text Field", myString);
- groupEnabled = EditorGUILayout.BeginToggleGroup ("Optional Settings", groupEnabled);
- myBool = EditorGUILayout.Toggle ("Toggle", myBool);
- myFloat = EditorGUILayout.Slider ("Slider", myFloat, -3, 3);
- EditorGUILayout.EndToggleGroup ();
- }
- }
三 Editor
用于自定义Inspector面板, 继承自ScriptableObject,在UnityEditor命名空间下。必须在起名为Editor的文件夹下。
如下代码。 1 第5行的MyMain 一定对应要修改面板的类 2 类名任意 3 override void OnInspectorGUI (), override 关键字必须有。 而里面的排版 组件和EditorWindow 一致。
- using UnityEngine;
- using System.Collections;
- using UnityEditor;
- [CustomEditor(typeof(MyMain))]
- public class MyMainEditor:Editor {
- public override void OnInspectorGUI() {
- GUILayout.Label ("Base Settings", EditorStyles.boldLabel);
- MyMain myTarget = (MyMain) target;
- myTarget.coin = EditorGUILayout.IntSlider("Coins Num", myTarget.coin, 1, 10);
- GUILayout.Button("OK");
- }
- }
总结: 编辑器拓展。 基础类是ScriptableObject,配合MenuItem,能做基本选择处理 EditorWindow和Editor 相同点 1 均继承自ScriptableObject 2 组件均来自 GUILayout EditorGUILayout和EditorGUI。(GUILayout主要用到的是Label和Button) 不同点 1 EditorWindow是显示窗口,而Editor是做自定义Inspector
EditorGUILayout和EditorGUI的区别在于,EditorGUI是手动排版而EditorGUILayout是自动排版
最后简单介绍下ScriptableWizard,
继承自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扩展学习——四大名捕闹京东