一、MenuItem相关

使用MenuItem在编辑模式下添加选项按钮,实现不同的功能以满足开发需求。

注意:
1.使用MenuItem需要引入UnityEditor命名空间
2.添加的选项按钮执行的函数不需要管私有或者公有的,但需要是静态的,确保能够直接访问。

MenuItem参数简单介绍:
//MenuItem(string itemName, bool isValidateFunction, int priority)
   //itemName:菜单名称路径
   //isValidateFunction:默认false,true则表示点击菜单前就会调用,用来添加验证方法
   //priority:菜单项显示排序,越小就会越显示在上方,当相邻的两个优先级差大于11时,会自动被划分成两个组,不同的组中间会有一条分割线
MenuItem参数功能验证:

1.MenuItem 第二个参数 isValidateFunction 验证

//该参数的功能是给选项按钮添加一个验证方法,在未点击选项按钮之前执行,通过验证方法的返回值来判断添加的选项按钮是否可以点击
    [MenuItem("Tools/DelateAll", true, 10)]//添加一个DelateAll选项按钮的验证方法,路径需与添加的按钮保持一致
    static bool CheckDelate()//需要有一个bool返回值来验证
    {
        if (Selection.objects.Length > 0)//验证的一些条件
        {
            return true;//返回true 则DelateAll按钮是高亮可点击状态
        }
        return false;//false 则DelateAll按钮是灰色不可点击状态
    }

    [MenuItem("Tools/DelateAll", false, 10)]//添加一个DelateAll选项按钮
    static void Delate()
    {}

2.MenuItem 第三个参数priority验证

//显示顺序应该为:test2 test1 | test3 (|表示分组分割线)
    [MenuItem("Tools/test1", false, 1)]
    static void Test1()
    {}
    [MenuItem("Tools/test2", false, 0)]
    static void Test2()
    {}
    [MenuItem("Tools/tes3", false, 30)]
    static void Test3()
    {}

效果如下:

Unity中设置image组件的type属性为tiled时_快捷键

记录一下在不同位置添加选项按钮的方法:

1.Unity上方菜单栏自定义按钮

[MenuItem("Tools/DoSomethingTest")]//自定义路径,支持("Tools/Test/DoSomethingTest")
    static void DoSomethingTest_1()
    {}

2.在Unity系统功能栏里添加选项按钮,只需把路径改到系统选项路径

[MenuItem("Window/DoSomethingTest")]//在Window栏里添加选项按钮
    static void DoSomethingTest_2()
    {}

3.在Hierarchy窗口右键单击弹出的菜单栏添加选项按钮

//发现Hierarchy窗口的右键菜单栏其实就是GamemObject下的部分选项按钮,可以通过如下路径添加
    [MenuItem("GameObject/DoSomethingTest", false, 10)]
    static void DoSomethingTest_3()
    {}

4.在Project窗口右键单击弹出的菜单栏添加选项按钮

//发现Project窗口的右键菜单栏其实就是Assets下的选项按钮,可以通过添加到Assets下实现
    [MenuItem("Assets/DoSomethingTest")]
    static void DoSomethingTest_4()
    {}

5.当选中Hierarchy窗口里的物体时,在右键单击Inspector面板里组件时弹出的菜单栏里添加选项按钮,有两种方法,一种是使用MenuItem,一种是在需要添加的脚本里使用ContextMenu

[MenuItem("CONTEXT/PlayerMove/Change PlayerMove Something")]//固定用法("CONTEXT/组件名/选项按钮名")
    static void Test4(MenuCommand command)//一般用于一键初始化组件数据
    {
        var com = command.context as PlayerMove;//MenuCommand.context就是右键选中的当前组件
        if (com != null)//修改当前组件的值
            com.m_Speed = 13;
    }
public class PlayerMove : MonoBehaviour
{
    //两个参数
    //name 要对该变量添加的选项按钮
    //function 点击选项后执行的方法,必须存在,否则添加按钮不成功
    [ContextMenuItem("ChangeSpeed_2", "ChangeSpeed")]//对组件里该变量添加右击选项按钮ChangeSpeed_2,参数(name,function)
    public float m_Speed = 4;
    
	public bool m_CanShoot = false;
	
    //对该脚本组件右击添加选项按钮ChnageSpeed_1
    [ContextMenu("ChangeSpeed_1")]
    void ChangeSpeed()
    {
        m_Speed = 10;
    }
}
添加的菜单选项自定义快捷键

注:快捷键选项路径 需要隔开

//[MenuItem("Tools/Test _t")]//普通快捷键,t,	使用下划线_
    //[MenuItem("Tools/Test %t")]//组合快捷键,Ctrl+t,	%代表Ctrl
    //[MenuItem("Tools/Test #t")]//组合快捷键,Shift+t,	#代表Shift
    //[MenuItem("Tools/Test &t")]//组合快捷键,Alt+t,	&代表Alt
    [MenuItem("Tools/Test %#t")]//组合快捷键,Ctrl+Shift+t
    static void Test6()
    {
        Debug.Log("Test 6");
    }

二、Selection相关

editor模式下一般根据需求来操作单个或多个物体,这时候需要按条件获取到一些选中的object,通过UnityEditor.Selection来获取

[MenuItem("Tools/Show Select Info")]
    static void Test5()
    {
        //列举几个常用
        //Selection 通过里面的变量和静态方法按需求获取object
        //SelectionMode 选择模式,用来过滤选择用的
        Debug.Log(Selection.objects.Length);//选中的所有物体,包括Hierarchy和Project窗口
        Debug.Log(Selection.activeObject);//返回当前点击的场景游戏物体或Project资源(包括场景、脚本、预制等任意);选择多个则返回第一个选择的;未选择相应的则返回null
        Debug.Log(Selection.GetFiltered<TextAsset>(SelectionMode.Assets).Length);//返回按类型和模式过滤的当前选择,该行是筛选在Assets文件夹下选中的所有文本文件
    }

Selection里面的静态变量和静态函数基本能满足需求。