Unity编辑器拓展1_添加菜单按钮

1、编辑器相关文件夹介绍

1.1Editor

该文件夹可以放在项目的任何文件夹下,可以有多个"Editor"文件夹。

编辑器扩展相关的脚本都要放在该文件夹内,该文件夹中的脚本只会对Unity编辑器起作用。

项目打包的时候,不会被打包到项目中。如果编辑器相关脚本不放在该文件夹中,打包项目可能会出错。

如果非要有些编辑器相关脚本不放在该文件夹中,需要在该类的前后加上UNITY_EDITOR的宏定义

1.2Editor Default Resources

该文件夹需要放在Assets根目录下,用来存储编辑器所需要的图片等资源,书写的时候需要注意中间有空格隔开。此文件夹也不会被打包,访问方法为:EditorGUIUtility.Load()

当然,也可以在Editor文件夹内创建一个Resources文件夹,将相关资源放在该文件夹内,通过Resources.Load()获取资源,也是可以的

1.3Gizmos

该文件夹也需要放在Assets根目录下,可以用来存放Gizmos.DrawIcon()的图片资源

1.4编辑器扩展的命名空间:

Using UnityEditor

2、添加菜单栏

2.1添加顶部菜单栏按钮

1)、[MenuItem(“MyTools / test1”, false, priority)]

  • 第一个参数用来表示菜单的路径;
  • 第二个参数用来判断是否是有效函数,是否需要显示;
  • 第三个参数priority是优先级,用来表示菜单按钮的先后顺序,默认值为1000。一般菜单中的分栏,数值相差大于10。
  • 注意需要是静态方法

例如:[MenuItem(“MyTools/test1”)]

也可以添加在Unity默认的菜单栏中,例如添加到Window菜单中,[MenuItem(“Window/test2”)],添加到Assets下,[MenuItem(“Assets/Project中的按钮”)]

代码

    [MenuItem("MyTools/MenuItemTest", false, 100)]

    public static void MenuItemTest()

    {

        Debug.Log("MenuItemTest");

    }

效果展示

2)、添加快捷键

代码

    [MenuItem("MyTools/Test2 &_d", false, 101)]

    public static void Test2()

    {

        Debug.Log("Test2");

    }

效果展示

快捷键对应符号

符号

字符

%

Ctr/Command

#

Shift

&

Alt

LEFT/Right/UP/DOWN

方向键

F1-F2

F功能键

_g

字母g

3)、CONTEXT 给某组件添加右键菜单选项

代码

    [MenuItem("CONTEXT/Transform/Test3")]

    public static void Test3()

    {

        Debug.Log("Test3");

    }

效果展示

4)、MenuCommand用于获取当前操作的组件

代码

    [MenuItem("CONTEXT/Transform/Test4")]

    public static void Test4(MenuCommand target)

    {

        Transform tran = target.context as Transform;

        Debug.Log("Test4");

        Debug.Log(tran.name);

    }

效果展示

2.2组件右键添加按钮 [ContextMenu("Test5", false, 10)]

代码

    [ContextMenu("Test5", false, 10)]

    public void Test5()

    {

        Debug.Log("Test5");

    }

效果展示

2.3ContextMenuItem给某属性添加右键菜单选项

同一个成员变量可以添加多个ContextMenuItem

代码

    [ContextMenuItem("Test6", "Test6")]

    [ContextMenuItem("Test7", "Test7")]

    public string strName = "ZTTT";



    public void Test6()

    {

        Debug.Log(strName);

        Debug.Log("Test6");

    }

    public void Test7()

    {

        Debug.Log(strName);

        Debug.Log("Test7");

    }

效果展示

PS. 这两个特性是在UnityEngine命名空间下的,而不像其他[MenuItem]、Selection是在UnityEditor下的。

3、Selection

用于获取选择的游戏物体

  • Selection.activeGameObject 返回第一个选择的场景中的对象
  • Selection.gameObjects 返回场景中选择的多个对象,包含预制体等
  • Selection.objects 返回选择的多个对象
//遍历选择的对象,并立刻销毁

foreach(object obj in Selection.objects)

{

    DestroyImmediate(obj);

}

PS. Destroy方法会将删除的对象放在缓存中,缓存满了,才完全删除,而在编辑器未运行的时候,是没有这片缓存的,所以需要用DestroyImmediate(),立刻销毁。当然,可以直接使用Undo.DestroyObjectImmediate()来销毁对象并记录销毁操作

测试代码

using System.Collections;

using System.Collections.Generic;

using UnityEditor;

using UnityEngine;



public class Test01_CaiDan : MonoBehaviour

{

    //[MenuItem]

    //添加菜单栏按钮



    //[MenuItem(“MyTools / test1”, false, priority)]



    //第一个参数用来表示菜单的路径;

    //第二个参数用来判断是否是有效函数,是否需要显示;

    //第三个参数priority是优先级,用来表示菜单按钮的先后顺序,默认值为1000。一般菜单中的分栏,数值相差大于10。

    //注意需要是静态方法



    //例如:[MenuItem(“MyTools / test1”)]

    //也可以添加在Unity默认的菜单栏中,例如添加到Window菜单中,[MenuItem(“Window / test2”)],添加到Assets下,[MenuItem(“Assets / Project中的按钮”)]



    [MenuItem("MyTools/MenuItemTest", false, 100)]

    public static void MenuItemTest()

    {

        Debug.Log("MenuItemTest");

    }



    [MenuItem("MyTools/Test2 &_d", false, 101)]

    public static void Test2()

    {

        Debug.Log("Test2");

    }



    [MenuItem("CONTEXT/Transform/Test3")]

    public static void Test3()

    {

        Debug.Log("Test3");

    }



    [MenuItem("CONTEXT/Transform/Test4")]

    public static void Test4(MenuCommand target)

    {

        Transform tran = target.context as Transform;

        Debug.Log("Test4");

        Debug.Log(tran.name);

    }



    //ContextMenu、ContextMenuItem

    //给某组件添加右边小齿轮菜单选项

    [ContextMenu("Test5", false, 10)]

    public void Test5()

    {

        Debug.Log("Test5");

    }



    [ContextMenuItem("Test6", "Test6")]

    [ContextMenuItem("Test7", "Test7")]

    public string strName = "ZTTT";



    public void Test6()

    {

        Debug.Log(strName);

        Debug.Log("Test6");

    }

    public void Test7()

    {

        Debug.Log(strName);

        Debug.Log("Test7");

    }



}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值