• Unity3D编辑器扩展(一)——定义自己的菜单按钮


    Unity3D 引擎的编辑器拥有很强的扩展性,用的好可以帮我们省很多事情。在这里记录下如何去扩展 Unity3D 的编辑器,定制属于我们自己的开发环境。

    本篇主要讲解在 Unity3D 引擎的各个窗口添加我们自己的菜单按钮。

    添加菜单按钮我们需要用到 MenuItem 特性:

    MenuItem 的三个重载:

    MenuItem(string itemName);

    MenuItem(string itemName, bool isValidateFunction);

    MenuItem(string itemName, bool isValidateFunction, int priority);

    参数详解:

    string itemName:菜单路径以及名称,可以设置多级菜单

     bool isValidateFunction:控制菜单是否被激活。

       通常都是通过两个函数来完成的:

      1、菜单的名称必须完全一致;

      2、第1个函数的第2个参数必须是 false 或不写,因为默认值就是 false,第2个函数的第2个参数必须是 true

      3、第2个函数的返回值必须是 bool 类型:如果函数的返回值如果返回 true,则本菜单被高亮激活,并执行第一个函数;如果返回值为 false,本菜单就为灰色,不可以被点击;

    int priority:控制菜单的显示上下的顺序。值越小越在上面显示,默认的优先级为1000;如果想要系统添加下划线,相邻的2个菜单的优先级的大小要超过 >= 11。

    添加我们自己的菜单有两点需要注意:

      1、MenuItem 的函数必须是静态(static)函数。

      2、脚本必须放在 Editor 文件夹下。

    在菜单栏添加菜单:

    代码:

    [MenuItem("MyMenuItem/Item1")]
        private static void Item1Do1()
        {
            Debug.Log("MyMenuItem Item1");
        }

    效果图:

    代码:

    [MenuItem("GameObject/Item1")]
        private static void Item1Do2()
        {
            Debug.Log("GameObject Item1");
        }

    效果图:

    第二个参数 bool isValidateFunction 的用法:

    代码:

    [MenuItem("MyMenuItem/Item2")]
        private static void Item2Do1()
        {
            Debug.Log(Selection.activeTransform.gameObject.name);
        }
        [MenuItem("MyMenuItem/Item2", true)]
        private static bool Item2Do2()
        {
            return Selection.activeTransform != null;
        }

    效果图:

    第三个参数 int priority 的用法:

    代码:

    [MenuItem("MyMenuItem/Item3", false, 1)]
        private static void Item3Do()
        {
            Debug.Log("Item3");
        }
        [MenuItem("MyMenuItem/Item4", false, 12)]
        private static void Item4Do()
        {
            Debug.Log("Item4");
        }

    效果图:

    Project 视图右键添加菜单:

    代码:

    [MenuItem("Assets/AssetsItem")]
        private static void AssetsItemDo()
        {
            Debug.Log("AssetsItem");
        }

    效果图:

    Hierachry层级视图添加右键菜单:核心是参数第三个参数 int priority,设置为10,添加到同一组内

    代码:

    [MenuItem("GameObject/Custom Game Object", false, 10)]
        private static void CreateCustomGameObject(MenuCommand menuCommand)
        {
            //创建一个新的游戏物体
            GameObject go = new GameObject("Custom Game Object");
            //menuCommand.context是当前鼠标左键选中的GameObjet游戏物体,通过GameObjectUtility.SetParentAndAlign函数设置为新创建的go物体的父节点
            GameObjectUtility.SetParentAndAlign(go, menuCommand.context as GameObject);
            //注册到U3D的Undo系统中。就是指我们可以使用Ctrl+Z组合键对这个物体进行撤销操作。
            Undo.RegisterCreatedObjectUndo(go, "Create " + go.name);
            //将鼠标的选中物体自动的移动到刚刚创建的go物体上
            Selection.activeObject = go;
        }

    效果图:

    Inspector 属性面板中添加一个右键菜单,功能可以通过MenuItem("COMTEXT/组件名称/右键菜单名称")完成

    代码:

    //MenuCommand 表示当前正在操作的组件
        //通过context 属性获取到 对应的脚本对象或游戏物体GameObject
        [MenuItem("CONTEXT/Rigidbody/SetMass=5")]
        private static void DoSomething(MenuCommand command)
        {
            Rigidbody body = (Rigidbody)command.context as Rigidbody;
            body.mass = 5;
            Debug.Log("Changed Rigidbody's Mass to " + body.mass + " from Context Menu...");
        }

    效果图:

    我们还有另外一种方法,就是通过 ContextMenu 特性来完成,效果是一样的。并且 ContextMenu 的函数重载和参数与 MenuItem 是一样的,前面已经写过了,这里就不赘述了。与  ContextMenu 不同的是,它是写在组件函数里面,且不用并不能放在 Editor 文件夹下。

    代码:

    public class ContextMenuTest : MonoBehaviour
    {
        [ContextMenu ("Do Something")]
        void DoSomething ()
        {
            Debug.Log ("Perform operation");
        }
    }

    效果图:

    接下来介绍另外两个属性:

    ContextMenuItem 为菜单绑定一个方法。

    代码:使 Reset 拥有了重置 playerBiography 值的功能。

    [ContextMenuItem("Reset", "ResetBiography")]
        public string playerBiography = "";
        void ResetBiography()
        {
            playerBiography = "";
        }

    AddComponentMenu:允许将我们的脚本添加到Component菜单的指定位置,而不是"Component->Scripts-->xxxx"。特例: menuName为空,则菜单中将隐藏此脚本的显示

    代码:

    [AddComponentMenu("MyCompenent/ContextMenuTest",200)]
    public class ContextMenuTest : MonoBehaviour 
    {
    }

    效果图:

    前面说了一大堆如何扩展自己的菜单,接下来我们说如何添加快捷键,毕竟使用快捷键比鼠标点爽多了有没有,而且显得很牛有没有。

     代码:

    [MenuItem("MyMenuItem/Item5 %G")]
        private static void Item5Do()
        {
            Debug.Log("Item5");
        }

    效果图:这样我们就给这个菜单按钮设置了快捷键:Ctrl+G

    设置快捷键的规则大致如下:

    % (ctrl on Windows, cmd on macOS), # (shift), & (alt).

    "MyMenu/Do Something _g" 快捷键g,字母签名添加下划线

    "#LEFT" :shift+ left. 其他的一个键的支持情况: LEFT, RIGHT, UP, DOWN, F1 .. F12, HOME, END, PGUP, PGDN.

    快捷键和前面的菜单名称中间必须加入空格,否则无效

    _w 单一的快捷键 W 

    #w shift+w 

    %w ctrl+w 

    &w Alt+w

  • 相关阅读:
    第十二周工作总结
    第八周工作总结
    冲刺2
    冲刺1
    用户场景分析
    用户场景分析
    水王在哪
    课堂练习-4个数的和
    《大道至简》第一章读后感
    ELF Format 笔记(三)—— Section Types
  • 原文地址:https://www.cnblogs.com/xiaoyulong/p/10115053.html
Copyright © 2020-2023  润新知