介绍
对Unity编辑的功能进行扩展,如:添加窗口,菜单栏等,命名空间为:using UnityEditor;,单独放在Editor文件下
菜单栏
MenuItem
在方法名前使用特性 [MenuItem("路径", false, 100)]
- 第一个参数:菜单栏的路径,如果没有该路径,则重新创建一个菜单栏
- 第二个参数:判断是否是有效函数,是否需要显示。
- 第三个参数:优先级,菜单项显示的顺序。默认值为1000,两个优先级之间超过10级,则会出现分隔栏
[MenuItem("Window/My Window")]
static void TestMenu()
{
}
效果如下:
参数二
设置为true会先执行,用来判断后面设置为false的要不要执行和菜单栏显示
//先执行,返回true的话,后面的就会执行,也就是函数执行,菜单显示
[MenuItem("Tools/TestMenu", true, 2)]
static bool TestMenu3()
{
if(Selection.objects.Length > 0)
{
return true;
}
else
{
return false;
}
}
[MenuItem("Tools/TestMenu", false, 2)]
static void TestMenu2()
{
foreach(Object obj in Selection.objects)
{
Undo.DestroyObjectImmediate(obj); //在编辑模式下用于删除
}
}
如果返回false的话,效果如下
为true的话,效果如下
分割栏
[MenuItem("Toos/TestMenu", false, 2)]
static void TestMenu()
{
}
[MenuItem("Toos/TestMenu2", false, 22)]
static void TestMenu2()
{
}
[MenuItem("Toos/TestMenu3", false, 2)]
static void TestMenu3()
{
}
效果图如下
在Hierarchy面板里显示菜单栏
当优先级小于在Hierarchy右键的的菜单栏时,就可以出现在右键菜单栏了,当然路径也要是在GameObject里。
其它面板也是一样的,如Object面板右键菜单,是在Assets下,那么路径也要是在Assets下
[MenuItem("GameObject/TestMenu", false, 5)]
static void TestMenu3()
{
}
效果图
CONTEXT
给某组件添加右键菜单选项,用法和MenuItem一样,路径为:"CONTEXT/要右键点击的组件名/要创建的菜单"
名称必须大写
[MenuItem("CONTEXT/BoxCollider/TestMenu", false, 2)]
static void TestMenu()
{
}
效果如下
ContextMenu
直接在该组件脚本里添加右键,无需在Editor文件下编写,无需引用using UnityEditor;处于using UnityEngine下
只能用于方法
[ContextMenu("setColor")]
void SetColor()
{
}
ContextMenuItem
为组件属性添加右键功能(属性必须是pubilc,否则看不到,就点不到呗)。和上面一样无需在Editor文件下编写,无需引用using UnityEditor;处于using UnityEngine下
[ContextMenuItem("按钮名", "调用函数名")]
[ContextMenuItem("SetColor", "SetColorFunc")]
public Color color = Color.red;
void SetColorFunc()
{
}
MenuCommand
用于获取当前操作的组件,作为参数使用
两个变量
- context:点击的组件对象
- userData:用于将自定义信息传递给菜单项的整数。
[MenuItem("CONTEXT/BoxCollider/TestMenu", false, 2)]
static void TestMenu(MenuCommand cmd)
{
Debug.Log(cmd.context.name); //返回的是点击的组件
}
添加快捷键
用法:[MenuItem("Tools/TestMenu _g", false, 2)]
符号 | 字符 |
---|---|
% | Ctr/Command |
# | Shift |
& | Alt |
LEFT/Right/UP/DOWN | 方向键 |
F1-F2 | F功能键 |
_g | 键盘g |
Selection
用于获取当前选择的游戏物体
- Selection.activeGameObject 返回第一个选择的场景中的对象,如果选择多个的话。必须是处于Hierarchy面板里的,否则报错
- Selection.gameObjects 返回场景中选择的多个对象,包含预制体等
- Selection.objects 返回选择的多个对象
[MenuItem("Tools/TestMenu", false, 2)]
static void TestMenu2()
{
Debug.Log(Selection.activeGameObject.name); //返回游戏对象名称
}
删除功能
[MenuItem("Tools/TestMenu", false, 2)]
static void TestMenu2()
{
foreach(Object obj in Selection.objects)
{
Object.DestroyImmediate(obj); //DestroyImmediate在编辑模式下用于删除
}
}
恢复功能
使用Undo.DestroyObjectImmediate进行删除
窗体
创建编辑器对话框
简单的快速创建对话框窗体的方式,继承自ScriptableWizard(实际继承于EditorWindow),用于编写对话框包含的属性
using UnityEditor;
public class EditorWindowsChange : ScriptableWizard {
public float ChangeHealth = 30f;
}
菜单栏脚本
用于调出对话框
[MenuItem("Tools/CreateWizard")]
static void TestMenu4()
{
ScriptableWizard.DisplayWizard<EditorWindowsChange>("同意修改", "Change Value");
}
这样就可以通过菜单栏调出对话框了,当然也可以写在同一脚本里
常用函数调用
- OnWizardCreate:点击确定按钮时调用(就是对话框的右下角按钮)
- OnEnable:显示时调用
- OnWizardUpdate:更新时调用
- OnDisable:隐藏时调用
- OnDestroy:销毁时调用
自定义窗体
像Game面板一样,可以自由浮动、像选项卡一样停靠。继承自EditorWindow类。用法和对话框一样
using UnityEditor;
public class EditorWindowsChange : EditorWindow {
[MenuItem("Tools/CreateWizard")]
static void TestMenu4()
{
EditorWindow.GetWindow<EditorWindowsChange>("同意修改");
}
}
效果如下
常用函数
- OnEnable:显示时调用
- OnGUI:绘制窗体内容。如:滑动条、Toggle等
自定义弹窗
用于实现在编辑器中弹出窗口,弹窗类继承自PopupWindowContent类,当弹窗失去焦点时,就会自动关闭。
using UnityEditor;
using UnityEngine;
//自定义窗体
public class EditorWindowsChange : EditorWindow {
private PopWindowExample popWindow = new PopWindowExample();
private Rect buttonRect;
[MenuItem("Tools/CreateWizard")]
static void TestMenu4()
{
EditorWindow.GetWindow<EditorWindowsChange>("同意修改");
}
//绘制窗体内容
private void OnGUI()
{
GUILayout.Label("Popup example", EditorStyles.boldLabel);
if (GUILayout.Button("Popup Options", GUILayout.Width(200)))
{
PopupWindow.Show(buttonRect, popWindow);
}
//获取GUILayout最后用于控件的矩形
if (Event.current.type == EventType.Repaint)
buttonRect = GUILayoutUtility.GetLastRect();
}
}
//自定义弹窗
public class PopWindowExample : PopupWindowContent
{
bool toggle = true;
//绘制弹窗内容
public override void OnGUI(Rect rect)
{
EditorGUILayout.LabelField("PopWindow");
toggle = EditorGUILayout.Toggle("Toggle", toggle);
}
public override Vector2 GetWindowSize()
{
//设置弹窗的尺寸
return new Vector2(200, 100);
}
}
常用函数
- OnOpen:开启弹窗时调用
- OnGUI:绘制弹窗。如:Toggle
- OnClose:关闭弹窗时调用
- GetWindowSize:设置窗口大小
ShowNotification
显示通知消息。在窗口上显示通知消息,一段时间自动消失。继承自EditorWindow类。调用 RemoveNotification 可立即删除通知。在OnGUI里调用
ShowNotification(new GUIContent("This is a Notification"));