在unity中我们可以看到上边的一排选项,都可以展开点击 选取相应的功能

unity 编译html 解析 unity设置编译器_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中就会添加一个我们自己的删除的按钮 同时可撤回