http://blog.sina.com.cn/s/blog_471132920101n8cr.html
原创文章如需转载请注明:转载自风宇冲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函数里写窗口结构
填写框 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 ();
//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");
ScriptableWizard.DisplayWizard<</span>
即可。
Reference: