zoukankan      html  css  js  c++  java
  • Unity3D中的Attribute详解(五)

    今天主要来讲一下Unity中带Menu的Attribute。

    首先是AddComponentMenu。这是UnityEngine命名空间下的一个Attribute。

    按照官方文档的说法,会在Component的菜单下面生成对应的菜单栏。选择预制或者GameObject,再点击菜单项,自动添加该Component。

    下面我们来试试,我在Editor文件夹下面新建了一个OhGod.cs的文件,取完名字我就后悔了,于是我修改了类名,代码如下:

    完美!我们来看看Component菜单。。。什么也没有多!!

    于是我翻了网上的资料,了解到这个属性有个暗坑,就是类名必须和cs的文件名一致!

    好吧,我改回去。

    然而,还是什么也没有。。。

    这时候我想到Editor是一个特殊的文件夹,会不会和这个有关系呢。

    把cs脚本移动到其他位置,这时候,菜单显示就正确了!

    选中场景中物件或者文件夹里的预制体,点击菜单,脚本就自动添加上去拉~

    需要注意的是,我在菜单里命名为cc/dd,如果你直接点击上图的Add Component按钮,是找不到OhGod这个脚本的!只有cc和dd才能找到。

    AddComponentMenu构造函数还有一个参数是优先级,可以设置同级菜单下面的菜单项的顺序,这里不做赘述了。

     如果我们有其他的菜单功能的话,最好能够新建一个菜单项。放在Component里肯定是不太好了。

    Unity继承了这个功能,不过这个Attribute在Editor命名空间里,就是UnityEditor.MenuItem

    看MenuItem的代码定义:

    using System;
    using UnityEngine.Scripting;
    
    namespace UnityEditor
    {
        // 摘要: 
        //     The MenuItem attribute allows you to add menu items to the main menu and
        //     inspector context menus.
        [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
        [RequiredByNativeCode]
        public sealed class MenuItem : Attribute
        {
            public string menuItem;
            public int priority;
            public bool validate;
    
            // 摘要: 
            //     Creates a menu item and invokes the static function following it, when the
            //     menu item is selected.
            //
            // 参数: 
            //   itemName:
            //     The itemName is the menu item represented like a pathname.  For example the
            //     menu item could be "GameObject/Do Something".
            //
            //   isValidateFunction:
            //     If isValidateFunction is true, this is a validation function and will be
            //     called before invoking the menu function with the same itemName.
            //
            //   priority:
            //     The order by which the menu items are displayed.
            public MenuItem(string itemName);
            //
            // 摘要: 
            //     Creates a menu item and invokes the static function following it, when the
            //     menu item is selected.
            //
            // 参数: 
            //   itemName:
            //     The itemName is the menu item represented like a pathname.  For example the
            //     menu item could be "GameObject/Do Something".
            //
            //   isValidateFunction:
            //     If isValidateFunction is true, this is a validation function and will be
            //     called before invoking the menu function with the same itemName.
            //
            //   priority:
            //     The order by which the menu items are displayed.
            public MenuItem(string itemName, bool isValidateFunction);
            //
            // 摘要: 
            //     Creates a menu item and invokes the static function following it, when the
            //     menu item is selected.
            //
            // 参数: 
            //   itemName:
            //     The itemName is the menu item represented like a pathname.  For example the
            //     menu item could be "GameObject/Do Something".
            //
            //   isValidateFunction:
            //     If isValidateFunction is true, this is a validation function and will be
            //     called before invoking the menu function with the same itemName.
            //
            //   priority:
            //     The order by which the menu items are displayed.
            public MenuItem(string itemName, bool isValidateFunction, int priority);
        }
    }

    可以看到它的附着点在函数上,而且必须是静态函数。

    我们还能够给菜单项添加热键,具体热键的定义如下:

    修改我们的代码:

     需要注意,热键重复的话,只会调用其中一条指令。

    Unity中的右键菜单也可以使用MenuItem来定义,这里有三条特殊的路径:Assets;Assets/Create;CONTEXT/ComponentName。

    修改代码如下:

    其中上面两个菜单项,你可以在Project视图中右键找到,Create菜单还能在Project的Create按钮里找到新加项目。

    最后一个菜单项则是在Inspector视图里,当你右键一个脚本的时候会有菜单弹出。上述例子中,Rigidbody限定了脚本。

    MenuItem还有一个参数是验证(Validation),默认为false,如果设为true,则需要方法返回一个布尔值。

    添加代码如下:

    或者

    这里比较坑爹的是同样的菜单项你必须写两次,一个用来回调,一个用来验证,只写下面的菜单是显示不出来的!

     

    MenuItem的最后一个参数是索引值,可以排顺序。

    在我们上述三种特殊路径的菜单中,最后一种绑定在RigidBody的菜单,我们可以在回调中获得脚本对象,只要修改代码如下:

    在UnityEngine域名中还有ContextMenuContextMenuItem两个菜单属性,声明在UnityEngine的命名空间中。

    ContextMenu和MenuItem+“CONTEXT/...”的显示效果是一致的,一般用在当前的脚本上(即ContextMenu定义的脚本上),回调方法不能是静态的方法。

    代码如下:

    ContextMenu构造函数还有一些参数和MenuItem基本一致,这里不再赘述。

    ContextMenuItem的用法我们可以通过一个案例来了解一下:

    只有在Random Name上面右键才会出现的菜单项。

    至此我们关于Menu相关的Attribute讲完了。

  • 相关阅读:
    搭建docker registry私有镜像仓库
    安装go client调用Kubernetes API
    Kubernetes搭建Hadoop服务
    Kubernetes部署Kafka集群
    Kubernetes使用StorageClass动态生成NFS类型的PV
    Linux配置网络服务
    Kubernetes设置命名空间
    Kubernetes的简单Demo
    docker操作的一些例子
    MySQL的一些基本概念
  • 原文地址:https://www.cnblogs.com/cangxw/p/8275534.html
Copyright © 2011-2022 走看看