从Unity中的Attribute到AOP(五)
今天主要来讲一下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域名中还有ContextMenu和ContextMenuItem两个菜单属性,声明在UnityEngine的命名空间中。
ContextMenu和MenuItem+“CONTEXT/...”的显示效果是一致的,一般用在当前的脚本上(即ContextMenu定义的脚本上),回调方法不能是静态的方法。
代码如下:


ContextMenu构造函数还有一些参数和MenuItem基本一致,这里不再赘述。
ContextMenuItem的用法我们可以通过一个案例来了解一下:


只有在Random Name上面右键才会出现的菜单项。
至此我们关于Menu相关的Attribute讲完了。
从Unity中的Attribute到AOP(五)的更多相关文章
- 从Unity中的Attribute到AOP(七)
本章我们将依然讲解Unity中的Attribute,继续命名空间在UnityEngine里的. PropertyAttribute,这个特性主要来控制变量或者类在Inspector里面的显示方式.和P ...
- 从Unity中的Attribute到AOP(四)
本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b). 首先是Serializable,SerializeField以及NonSerialized,H ...
- 从Unity中的Attribute到AOP(三)
上一篇我们对系统的Attributes进行了MSIL代码的查看,了解到了其本质就是一个类的构造函数.本章我们将编写自己的Attributes. 首先我们定义书的属性代码,如下: [AttributeU ...
- 从Unity中的Attribute到AOP(六)
本文将重点对Unity剩下常用的Attribute进行讲解,其他不常用的Attribute各位可以自行去官方文档查阅. 首先是UnityEngine命名空间下的. ColorUsage,这个主要作用于 ...
- 从Unity中的Attribute到AOP(八)
本文将讲一下在UnityEditor命名空间下的一些特性. CallBackOrder,这个Attribute是所有带callback index的Attribute的基类,由于官方也没有给出详细的说 ...
- 从Unity中的Attribute到AOP(二)
上一篇文章我们初步了解了一下Attributes的含义,并且使用系统自带的Attributes写了点代码.在进一步解剖我们的代码之前,我觉得有个概念可能需要巩固一下:什么是元数据? 我们知道C#代码会 ...
- 从Unity中的Attribute到AOP(一)
首先来看一下微软官方对Attributes(C#)的定义: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/conce ...
- Unity中使用Attribute
Attribute是c#的语言特性 msdn说明如下: The Attribute class associates predefined system information or user-def ...
- Unity应用架构设计(12)——AOP思想的实践
想象一下,当程序所有的业务逻辑都完成的时候,你可能还来不及喘口气,紧张的测试即将来临.你的Boss告诉你,虽然程序没问题,但某些方法为什么执行这么慢,性能堪忧.领会了Boss的意图之后,漫长的排查问题 ...
随机推荐
- 新ITC提交APP常见问题与解决方法(Icon Alpha,Build version,AppIcon120x120)(2014-11-17)
1)ICON无法上传.提示图片透明(有Alpha通道) 苹果如今不接受png里的Alpha了.提交的图标带有Alpha通道就提示: watermark/2/text/aHR0cDovL2Jsb2cuY ...
- 自学Zabbix3.5.4-监控项item-History and trends
历史和趋势是在Zabbix中存储收集数据的两种方法.然而,历史保持着每一个收集的价值,趋势保持每小时的平均信息,因此减少了对资源的需求. 1. 保留历史数据 我们可以通过如下方式来设置保留数据的时 ...
- Python 项目实践一(外星人入侵小游戏)第五篇
接着上节的继续学习,在本章中,我们将结束游戏<外星人入侵>的开发.我们将添加一个Play按钮,用于根据需要启动游戏以及在游戏结束后重启游戏.我们还将修改这个游戏,使其在玩家的等级提高时加快 ...
- 【CSS3】定位
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 关于使用Xcode9.0使用[UIImage imageNamed:]返回null的问题
最近升级Xcode9.0,没少折腾,再加上iOS11出现的问题,又要适配一些奇怪的问题.这都没啥,但是如果Xcode出问题,那问题可真是难找.因为习惯的操作潜意思的告诉自己这样做是不会错的. 在Xco ...
- 函数PYXX_READ_PAYROLL_RESULT的dump问题
发现有两个HR的后台定时任务出现dump,日志表示,是PYXX_READ_PAYROLL_RESULT产生了类型冲突的异常CX_SY_DYN_CALL_ILLEGAL_TYPE. 日志标题部分: 类别 ...
- 百度云BCC配置Apache VirtualHost 实现相同域名不同端口访问不同应用
问题描述:前戏:本人在百度云上购买了BCC虚拟服务,并购买域名,部署应用,可以正常访问(这里一切都很正常^_^). 事情正在起变化:随着开发的不断推进,工程在本地测试成功后,部署到服务器,会发现有些页 ...
- Android Activity生命周期详细解析
概况 讲Android Activity那怎么都绕不过这张图,这篇文章也是围绕这幅图详细分析. 背景 假设这是你的APP,以此为背景,下面的每个part请结合上图理解. #Case 1 当按下app启 ...
- Linux下添加源的几种方法
sudo add-apt-repository xxxxxxx sudo gedit /etc/apt/sources.list然后把源粘贴进去,保存,最后shell输入sudo apt-get u ...
- Java SE 8 流库(三)
1.7. Optional类型 容器对象,可能包含或不包含非空值.如果存在一个值,isPresent()将返回true,get()将返回值.还提供了依赖于包含值是否存在的附加方法,如orElse()( ...