【Unity】编辑器基础扩展一:MenuItem及相关操作(Selection)

一、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()
    {}

效果如下:
在这里插入图片描述

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

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里面的静态变量和静态函数基本能满足需求。

官方文档介绍:https://docs.unity3d.com/ScriptReference/Selection.html
详细博客介绍:https://blog.csdn.net/qq_33337811/article/details/72858209

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Unity 编辑器扩展中随机选择场景中的对象,你可以使用以下方法: 1. 使用 Object.FindObjectsOfType() 方法获取当前场景中的所有对象,并将其存储到一个数组中。 2. 使用 Random.Range() 方法生成一个随机数,用它来选择数组中的一个随机索引。 3. 使用所选索引来获取数组中的随机对象。 这里是一个示例代码,它在 Unity 编辑器中创建了一个按钮,点击该按钮将随机选择场景中的一个 Cube 对象并将其设置为选中状态: ```csharp using UnityEditor; using UnityEngine; public class RandomObjectSelector : EditorWindow { [MenuItem("Window/Random Object Selector")] static void OpenWindow() { RandomObjectSelector window = GetWindow<RandomObjectSelector>(); window.Show(); } void OnGUI() { if (GUILayout.Button("Select Random Object")) { // 获取场景中所有的 GameObject 对象 GameObject[] objects = Object.FindObjectsOfType<GameObject>(); // 生成一个随机索引并获取随机对象 int randomIndex = Random.Range(0, objects.Length); GameObject randomObject = objects[randomIndex]; // 设置随机对象为选中状态 Selection.activeGameObject = randomObject; } } } ``` 请注意,这个示例只是一个基本的概念演示,你需要根据自己的场景和需求进行修改和优化。同时,这个示例中使用了 Unity 编辑器窗口来创建按钮,你可以将这个代码添加到你的自定义编辑器窗口中,或者将代码添加到自定义菜单项或工具栏按钮的回调函数中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值