工欲善其事必先利其器
引言: 在项目开发中,编辑器扩展为开发者提供了开发自定义工具的功能,让开发者更加便利地使用编辑器开发项目。近期小生一直在学习编辑器扩展的知识,发现网络上关于编辑器知识点的博客较为零散且混乱。当然,有一些大佬已经总结的很好了,小生这就算是狗尾续貂,主要目的为自我学习,近期会整理一系列编辑器相关的博客,分享给每一位在学习道路上奋斗的童鞋。如若博客中存在错误,还请大佬们不吝赐教。所有参考的博客或者视频来源将在文末展示。
开发版本: Unity 2018.1.3f1
相关博客传送门
一、编辑器开发入门
二、Gizmos辅助调试工具
三、编辑器的相关特性
四、自定义Inspector面板
五、数组或list集合的显示方式
编辑器扩展的命名空间:
Using UnityEditor
添加菜单栏按钮
[MenuItem(“MyTools/test1”,false,priority)]
实现点击菜单按钮,删除场景或者Project中选中的多个对象
[MenuItem("MyTool/DeleteAllObj", true)]
private static bool DeleteValidate()
{
if (Selection.objects.Length > 0)
return true;
else
return false;
}
[MenuItem("MyTool/DeleteAllObj",false)]
private static void MyToolDelete()
{
//Selection.objects 返回场景或者Project中选择的多个对象
foreach (Object item in Selection.objects)
{
//记录删除操作,允许撤销
Undo.DestroyObjectImmediate(item);
}
}
DeleteValidate方法是MyToolDelete方法的有效函数,所以第二个参数为true。该有效函数用来判断当前是否选择了对象,如果选择了,返回true,才可以执行MyToolDelete方法。
添加快捷键
符号 | 字符 |
---|---|
% | Ctr/Command |
# | Shift |
& | Alt |
LEFT/Right/UP/DOWN | 方向键 |
F1-F2 | F功能键 |
_g | 字母g |
例如:[MenuItem(“MyTools/test1 %_q”)] 快捷键 Ctrl+Q
给某组件添加右键菜单选项
[MenuItem(“CONTEXT/组件名/按钮名”)]
注意CONTEXT大写
[MenuItem("CONTEXT/Rigidbody/Init")]
private static void RigidbodyInit()
{
//TODO
}
用于获取当前操作的组件
如下,给自定义的组件PlayerHealth添加右键Init按钮
[MenuItem("CONTEXT/PlayerHealth/Init")]
static void Init(MenuCommand cmd)
{
PlayerHealth health = cmd.contex as PlayerHealth;
}
给某组件添加右边小齿轮菜单选项
[ContextMenu("FunctionName")]
public void FunctionName()
{
//ToDo
}
给某属性添加右键菜单选项
[ContextMenuItem("Handle", "HandleHealth")]
public float health;
private void HandleHealth()
{
//ToDo
}
P.S. 这两个特性是在UnityEngine命名空间下的,而不像其他[MenuItem]、Selection是在UnityEditor下的。
用于获取选择的游戏物体
//遍历选择的对象,并立刻销毁
foreach(object obj in Selection.objects)
{
DestroyImmediate(obj);
}
P.S. Destroy方法会将删除的对象放在缓存中,缓存满了,才完全删除,而在编辑器未运行的时候,是没有这片缓存的,所以需要用DestroyImmediate(),立刻销毁。当然,可以直接使用Undo.DestroyObjectImmediate()来销毁对象并记录销毁操作
编辑器特殊文件夹及内置资源读取
Unity编辑器小教程
MenuItem和ContextMenu的使用方法