扩展编辑器实际上就是在unity菜单栏中添加一些按钮,可以一键执行一些重复性的工作。
一.添加按钮
1.简单使用MenuItem特性
using UnityEngine; using UnityEditor; public class Tools { [MenuItem("Tools/test")] static void Test() { Debug.Log("test"); } }
2.路径设置
在方法上添加MenuItem特性,在MenuItem的括号中传入路径字符串参数,路径中使用/进行目录分级。第3个参数priority为选项在目录中的显示顺序,这个值默认是1000。
using UnityEngine; using UnityEditor; public class Tools { //MenuItem的第3个参数priority为当前选项在菜单栏中的显示顺序,数字越大,显示在越下面 //当相邻两个选项的priority值相差大于等于11时,系统将在这两个选项之间添加一条横线进行分组 [MenuItem("Tools/test1",false,2)] static void Test1() { Debug.Log("test1"); } [MenuItem("Tools/test2",false,1)] static void Test2() { Debug.Log("test2"); } [MenuItem("Tools/test3",false,13)] static void Test3() { Debug.Log("test3"); } }
3.Hierarchy和Project窗口的右键菜单
Hierarchy窗口中右键的菜单实际上是一些复制粘贴等按钮和GameObject目录下第一类的按钮的组合,因此将按钮添加到GameObject菜单下第一类按钮中即可在Hierachy窗口中右键出这个按钮。
Project窗口的右键菜单实际上就是Assets目录,因此将按钮添加到Assets目录下即可在Project窗口中右键出这个按钮。
4.在组件的右键菜单中添加按钮
using UnityEditor; using UnityEngine; public class PlayerEditor { //在组件上的右键菜单中添加按钮路径参数为“CONTEXT/需要添加按钮的组件名称/按钮目录和名称” [MenuItem("CONTEXT/PlayerHealth/InitHealthAndSpeed")] static void InitHealthAndSpeed(MenuCommand command) { //在按下按钮后,系统自动传递参数MenuCommand,对象的context属性的内容就是当前组件 CompleteProject.PlayerHealth health = command.context as CompleteProject.PlayerHealth; //获取当前组件后,可以进行修改组件的变量等操作 health.startingHealth = 10000; health.flashSpeed = 15; } }
5.Selection获取选择的游戏物体
using UnityEditor; using UnityEngine; public class PlayerEditor { [MenuItem("Test/showInfo")] static void InitHealthAndSpeed() { Debug.Log(Selection.objects.Length); } }
6.按钮快捷键
using UnityEditor; using UnityEngine; public class PlayerEditor { //在路径名称后空格再指定快捷键,这里指定快捷键是T //一些快捷键例子:_t ==> T // %t ==> Ctrl+T // #t ==> Shift+T // &t ==> Alt+T [MenuItem("Test/showInfo _t")] static void InitHealthAndSpeed() { Debug.Log(Selection.objects.Length); } }
7.按钮的验证方法
using UnityEditor; using UnityEngine; public class PlayerEditor { //按钮的验证方法和按钮方法的菜单路径一致,返回值为bool值,将MenuItem的第二个参数置为true代表这是一个按钮的验证方法 //这个方法判断选中的游戏物体数,如果选中了任意游戏物体才能点击按钮;未选中游戏物体按钮将变为不可点击状态 [MenuItem("Test/showInfo _t",true,11)] static bool InitHealthAndSpeedValidate() { if (Selection.objects.Length > 0) return true; else return false; } //日志输出选中的游戏物体数目 [MenuItem("Test/showInfo _t",false,11)] static void InitHealthAndSpeed() { Debug.Log(Selection.objects.Length); } }
8.为组件添加按钮的另一种方式
使用ContextMenu特性为组件添加按钮,注意这个特性添加在一个具体的方法上方,代表按钮触发这个方法,而这个方法必须是要添加按钮的脚本内的方法,可以理解为直接在脚本中定义按钮。
//为脚本添加SetColor按钮,按钮触发这个方法改变脚本中flashColour的属性值 [ContextMenu("SetColor")] void SetColor() { flashColour = Color.blue; }
使用ContextMenuItem特性为脚本的某个属性添加按钮,这个特性自然也就定义在需要添加按钮的属性上方,按钮触发的方法也定义在脚本中。
//这个特性代表为startingHealth属性添加一个AddHP100按钮,在属性上右键即可看到这个按钮,这个按钮会触发AddHP这个方法 [ContextMenuItem("AddHP100","AddHP")] public int startingHealth = 100;
void AddHP() { startingHealth += 100; }
二.添加和使用对话框
1.简单添加对话框
首先创建一个按钮用于弹出对话框。
using UnityEditor; using UnityEngine; public class PlayerEditor { [MenuItem("Tools/CreateWizard")] static void CreateWizard() { //按下按钮后弹出对话框,对话框的标题为“这是对话框”,对话框的内容由ShowDialog这个脚本进行定义 ScriptableWizard.DisplayWizard<ShowDialog>("这是对话框"); } }
然后定义对话框,对话框需要继承自ScriptableWizard类。
using UnityEditor; public class ShowDialog : ScriptableWizard { public int changeHealthValue = 100; }
最后保存后在unity中点击按钮就可以看到对话框了。
注意:推荐将按钮的代码写在对话框的类中,结构会更加清晰,方便管理。
2.DisplayWizard方法的参数
using UnityEditor; public class ShowDialog : ScriptableWizard { [MenuItem("Tools/CreateWizard")] static void CreateWizard() { //两个参数都是字符串,第一个参数定义对话框的标题,第二个参数定义右下角确认提交按钮的名称,默认是Create ScriptableWizard.DisplayWizard<ShowDialog>("这是对话框","Change"); } public int changeHealthValue = 100;
3.在对话框确认提交后触发OnWizardCreate方法
using UnityEditor; using UnityEngine; public class ShowDialog : ScriptableWizard { [MenuItem("Tools/CreateWizard")] static void CreateWizard() { //两个参数都是字符串,第一个参数定义对话框的标题,第二个参数定义右下角确认提交按钮的名称,默认是Create ScriptableWizard.DisplayWizard<ShowDialog>("这是对话框","Change"); } public int changeHealthValue = 100; //监测对话框确认提交按钮,对话框确认提交后触发 private void OnWizardCreate() { GameObject[] gos = Selection.gameObjects; foreach(GameObject go in gos) { go.GetComponent<EnemyHealth>().startingHealth += changeHealthValue; } } }
4.ScriptableWizard类中的其他Message
OnWizardUpdate方法:当打开对话框或对话框中的值发生改变时触发。
OnWizardOtherButton方法:当用户点击others按钮时触发,这个按钮可以通过DisplayWizard方法的第3个参数指定名称,others按钮不会关闭对话框。
三.使用EditorWindow类创建窗口
using UnityEngine; using UnityEditor; public class ShowWindow : EditorWindow { [MenuItem("Window/show mywindow")] static void ShowMyWindow() { ShowWindow window = EditorWindow.GetWindow<ShowWindow>("MyWindow"); window.Show(); } private void OnGUI() { GUILayout.Label("我的窗口"); GUILayout.TextField(""); GUILayout.Button("创建"); } }