Unity编译器拓展学习总结(二):各个平台菜单栏拓展

文章详细介绍了如何使用Unity的MenuItem特性进行各种面板的菜单拓展,包括在Tools、GameObject、Assets面板添加自定义菜单,以及在游戏物体Inspect面板拓展组件功能。通过这些拓展,开发者可以自定义编辑器行为,提高开发效率。
摘要由CSDN通过智能技术生成

Unity编译器拓展学习总结(二):各个平台菜单栏拓展


前情参考:Unity编译器拓展学习总结(一):常用工具API


前言

上篇文章我们介绍了编译器拓展的工具API,这篇文章根据编译器拓展插件的具体位置介绍编译器拓展。


菜单栏拓展

使用MenuItem特性进行拓展,可以设置不同的属性,可以通过这个特性加在任何位置的菜单栏。

1、MenuItem的写法

using UnityEditor;
using UnityEngine;

public class MenuItemTest
{
    //第一个参数表示在菜单栏的Menu的路径,点击将会执行这个方法
    [MenuItem("Tools/test/Test1")]
    static void MenuTest1()
    {
        Debug.Log("Test1");
    }

    #region MenuItem的验证方法加入
    //第一个参数表示是否为验证方法,为true时,当返回值为true时,菜单中的按钮才可进行操作,注意:需要有一个非验证方法才能起作用,即
    //第二个参数为false,且其他参数必须保持一致
    [MenuItem("GameObject/my delete",true,11)]
    static bool MyDeleteValidate()
    {
       return Selection.gameObjects.Length > 0;
    }
    [MenuItem("GameObject/my delete",false, 11)]
    static void MyDelete()
    {
        foreach (var o in Selection.objects)
        {
            //GameObject.DestroyImmediate(o);
            Undo.DestroyObjectImmediate(o);//利用Undo进行的删除操作是可以撤销的
        }
        //需要把删除操作注册到操作记录中
    }
    #endregion
    #region 优先级
    //第三个参数为优先级
    //每一个菜单栏的priority优先级默认1000,与上一个最大的按钮优先级相差大于等于11会分到另外一组
    [MenuItem("Tools/test/Test1",false,1)]
    static void Test1()
    {
        Debug.Log("Test1");
    }
     //一些快捷键的加入:%表示Ctrl键,#表示Shift键,&表示Alt
    //小写字母则是表示26个字母键盘,注意:控制按键不能单独存在,小写字母也不能单独存在,控制键需要写在前面,注意快捷键冲突
    [MenuItem("Tools/test/Test2 _#q", false,2)]
    static void Test2()
    {
        Debug.Log("Test2");
    }
    //会被分到新的一组
    [MenuItem("Tools/test/Test3 _u", false,13)]
    static void Test3()
    {
        Debug.Log("Test3");
    }
    #endregion
 }

2、Hierarchy面板菜单拓展

        //path里面的路径,根路径必须是GameObject
        //一般优先级设为0,可以调整,但不能设的太大,不然会分到另外一组,会导致无法在Hirerarchy显示,只能在菜单栏显示
        [MenuItem("GameObject/My Method", false, 0)]
        static void MyDeleteValidate()
        {
            Debug.Log("MyMethod");
        }

3、Assets面板菜单拓展

    //path里面的路径,根路径必须是Assets
    //在Assets/Create/New Weapon目录下新建一个按钮,点击就执行下面的方法
    [MenuItem("Assets/Create/New Weapon")]
    public static void Creat()
    {
         Debug.Log("Creat");
    }

只适用于ScriptableObject的Assets面板菜单拓展

//fileName参数为点击后生成的文件名,menuName参数为相对与Assets/Create菜单的相对路径,不设置将默认以类名设置,order为相对优先级
[CreateAssetMenu(fileName = "Data1", menuName = "ScriptableObjects/SpawnManagerScriptableObject2", order = 2)]
public class SpawnManagerScriptableObject2 : ScriptableObject
{
    public string prefabName;
 
    public int numberOfPrefabsToCreate;
    public Vector3[] spawnPoints;
}

4、游戏物体Inspect面板菜单拓展

4.1、组件添加菜单拓展

        //path里面的路径,根路径必须是Component,一般是用于添加组件
        [MenuItem("Component/Add Test/Hello", false, 0)]
        static void AddComponetToGameObject()
        {
            Debug.Log("AddComponetToGameObject");
        }

4.2、组件菜单拓展

 //按照CONTEXT/组件名/按钮名的顺序进行书写,根路径必须是CONTEXT,如下点击该组件右上角三点时将会有Clear按钮
    //MenuCommand是当前正在操作的菜单命令正文
    [MenuItem("CONTEXT/Rigidbody/Clear")]
    static void ClearMassAndGravity(MenuCommand cmd)
    {
        //可以获取当前菜单命令正文的context字段获取当前正在操作的组件,接着就可以进行操作该组件了
        Rigidbody rgd=cmd.context as Rigidbody;
        rgd.mass = 0;
        rgd.useGravity = false;
    }

4.3、组件内部字段菜单拓展

使用ContextMenuItemAttrible特性进行拓展字段

public class PlayerHealth : MonoBehaviour
{
    //第一个参数为按钮名,第二个参数为方法名,需要是无参无返回的方法签名
    //在Inspector面板右击该字段会显示该按钮
    [ContextMenuItem("Add HP", "AddHP")]
    public int startingHealth = 100;

    void AddHP()
    {
        startingHealth += 20;
    }
}

总结

本篇文章介绍了各个显示窗口的菜单栏的拓展相关知识,通过对菜单栏进行拓展,可以增加各个各样的编译器按钮选项,出现不同的功能需求。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值