在unity中我们可以看到上边的一排选项,都可以展开点击 选取相应的功能
其实我们自己通过代码也可以添加相应功能
这篇博客给大家将介绍一下有关编译器扩展的方法 以后使用起来会很方便
首先给大家一个模板
[MenuItem("想要添加的选项/添加的按钮名称",false ,1)]
//其中的选项是Tools等就是上边截图的那一栏 false表示按钮是否启用(待会会具体讲到) 后边的数字是该栏中所要添加按钮的位置(顺序)
static void text1()
{
//方法一定要是静态
}
1.Selection类
Selection类是编辑器类,使用需要using UnitryEditor;
Selection.activeGameObject
//返回当前点击的场景游戏物体或Project预制体;选择多个则返回第一个选择的;未选择相应的则返回null
Selection.activeTransform
//返回当前点击的场景游戏物体;选择多个则返回第一个选择的;未选择相应的则返回null
Selection.activeObject
//返回当前点击的场景游戏物体或Project资源(包括场景、脚本、预制等任意);选择多个则返回第一个选择的;未选择相应的则返回null
Selection.gameObjects
//返回一个数组,内容为当前点击的场景物体或Project预制体;不符合条件的当前选择不会加入到数组;为选择返回长度为0的数组而不是null
Selection.objects
//返回一个数组,内容为当前点击的场景物体或Project资源(包括场景、脚本、预制等任意)
//不符合条件的当前选择不会加入到数组;为选择返回长度为0的数组而不是null
Selection.transforms
//返回一个数组,内容为当前点击的场景物体;不符合条件的当前选择不会加入到数组;为选择返回长度为0的数组而不是null
Selection.selectionChanged //委托,选择的东西变化的时候调用
///Contains:选择项中是否包含物体
bool Selection.Contains(int instanceID)
bool Selection.Contains(Object obj)
///GetFiltered:返回按类型和模式过滤的当前选择。
///对于一个具有多个类型组件的选定的游戏对象,只有第一个组件将包含在结果中。
///如果类型是Component或GameObject的子类,则支持完整的SelectionMode。
///如果类型不是Component或GameObject的子类,(例如:网格或脚本对象)则只支持有SelectionMode.ExcludePrefab和SelectionMode.Editable 。
Object[] activeGos = Selection.GetFiltered(GameObject, SelectionMode.Editable | SelectionMode.TopLevel);
///GetTransforms:允许使用SelectionMode对选择类型进行细粒度的控制。
Transform[] selectionObjs = Selection.GetTransforms(SelectionMode.TopLevel | SelectionMode.Editable);
2.模仿制作删除功能
这里首先整一个删除的功能
[MenuItem ("GameObject/My delete _%a",false ,12)]//11表示第11个位置 空格+_a 表示快捷键a(注意避免冲突)
static void mydelete()
{
foreach(var o in Selection.objects)//遍历选到的所有物体
{
//GameObject.DestroyImmediate(o);//此操作是不能注册进去操作记录的 所以ctrl+z不能撤回
Undo.DestroyObjectImmediate(o);//此操作是可以注册到操作记录的
}
}
注意点是 GameObject.DestroyImmediate(o);这个操作是不能撤回的 因为在unity中所有的操作包括点击 移动等都是会注册到操作记录的,但是这个方法不能注册到操作记录 所以ctrl+Z不能实现撤回
我们用到 Undo.DestroyObjectImmediate(o); 这个方法可以实现撤回功能
然后上边的My delete _%a 表示快捷键 在这里说下在这个方法中%表示Ctrl #表示shift &表示alt
所以上边的%a表示ctrl+A是快捷键 然后他必须前边加上一个下划线和空格
注意 快捷键的设置不能与unity官方的产生冲突
然后我们用到第二个参数true和false
这个是在有true的存在是 先调用true的静态方法 (bool类型)然后返回值如果是true 就可以继续下面的false里边的静态方法
如果返回false 则不能进行false的操作 在unity中就是灰色的(不能点击)
完整的可检测是否选中物体的操作如下
[MenuItem ("GameObject/My delete _%a",false ,12)]//11表示第11个位置 空格+_a 表示快捷键a(注意避免冲突)
//%表示Ctrl #表示shift &表示alt
static void mydelete()
{
foreach(var o in Selection.objects)//selection 是一个读取的类
{
//GameObject.DestroyImmediate(o);//此操作是不能注册进去操作记录的 所以ctrl+z不能撤回
Undo.DestroyObjectImmediate(o);//此操作是可以注册到操作记录的
}
}
[MenuItem ("GameObject/My delete _a",true ,12)]//验证方法 如果有验证方法先调用验证方法 在来false的方法
static bool mydeletes()//验证是否选中物体(否则让这个选项失活)
{
if(Selection.objects .Length >= 1)
{
return true;
}
else
{
return false;
}
}
这样在unity中就会添加一个我们自己的删除的按钮 同时可撤回