Unity中使用Attribute
Posted Alan777 游戏开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity中使用Attribute相关的知识,希望对你有一定的参考价值。
Attribute是c#的语言特性
msdn说明如下:
The Attribute class associates predefined system information or user-defined custom information with a target element. A target element can be an assembly, class, constructor, delegate, enum, event field,interface, method, portable executable file module, parameter, property, return value, struct, or another attribute.
Information provided by an attribute is also known as metadata. Metadata can be examined at run time by your application to control how your program processes data, or before run time by external tools to control how your application itself is processed or maintained. For example, the .NET Framework predefines and uses attribute types to control run-time behavior, and some programming languages use attribute types to represent language features not directly supported by the .NET Framework common type system.
All attribute types derive directly or indirectly from the Attribute class. Attributes can be applied to any target element; multiple attributes can be applied to the same target element; and attributes can be inherited by an element derived from a target element. Use the AttributeTargets class to specify the target element to which the attribute is applied.
The Attribute class provides convenient methods to retrieve and test custom attributes. For more information about using attributes, see Applying Attributes and Extending Metadata Using Attributes.
简单翻译如下:
Attribute类可以把目标元素和一个预定义的信息或者是用户自定义信息关联起来。这里的目标元素可以是assembly,class,constructor,delegate,enum,event,field,interface,method,可执行文件模块,parameter,property,return value,struct或其它的Attribute。
Attribute提供的信息也被称为元数据(metadata)。元数据能用于在运行时控制怎样访问你的程序数据,或者在运行前通过额外的工具来控制怎样处理你的程序或部署它。例如.NET Framework预定义并使用attribute去控制运行时行为,一些编程语言使用attribute类型来描述.NET Framework中通用类型不直接支持的语言特性。
所有的Attribute类型直接或间接从Attribute类继承。Attribute能应用到任何target元素;多个Attribute能应用到相同的元素;
Attribute类提供遍历的方法去取出和测试自定义Attribute。更多关于Attribute的信息,可以看Applying Attributes和Extending Metadata Using Attributes。
unity中的预定义attribute
看了上述说明,我们可能还不是很清楚attribute到底怎么用,我们先来看看Unity中常用的预定义attribute是怎么使用的,然后再学习怎么使用我们自己自定义的attribute。
DllImport
DllImport应用于方法,用于告诉运行时该方法位于指定的dll的非托管代码中(如c/c++,oc等),如果dll是托管代码生成的(如c#代码生成的dll),则不需要应用此特性。例如,当我们需要调用ios中的浏览器打开一个url时,可以先编写oc的方法,然后放在项目的plugin目录中,并且在c#脚本中应用DllImport就可以调用了。
oc代码:
NSString* CreateNSString (const char* string) { if (string) return [NSString stringWithUTF8String: string]; else return [NSString stringWithUTF8String: ""]; } extern "C" { void OpenUrl(const char* urlString) { //打开浏览器 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:CreateNSString(urlString)]]; return; } }
c#代码:
[DllImport("__Internal")] public static extern string OpenUrl(string url);
其他unity预定义attribute的使用可以参考http://blog.sina.com.cn/s/blog_5b6cb9500101857b.html。
使用自定义的attribute
自定义的attribute需要继承System.Attribute,然后我们可以使用c#的预定义特性去注明此attribute的应用范围。如果我们自定义的attribute名为UI,那么我们的自定义的attribute类名则应该为UIAttribute。
using System;
public enum UILayer
{
Default,
Secondary,
Popup,
TipAndWraning
}
[AttributeUsage(AttributeTargets.Class)]
public class UIAttribute : Attribute
{
public UILayer Layer { get; set; }
}
如上所示,我们定义了一个attribute,UI,并且指明了应用范围只能在类上应用。我们用这个attribute来注明不同的View类的Layer属性,使用代码如下:
[UI(Layer = UILayer.Default)] public class LoginView : View { //略 }
[UI(Layer = UILayer.Popup)] public class AlertInfoView : View { //略 }
当我们创建不同View类的实例时,可以从attribute中获取到Layer信息:
public View CreateView(System.Type type) { UIAttribute classAttribute = (UIAttribute)System.Attribute.GetCustomAttribute(type, typeof(UIAttribute)); View view = System.Activator.CreateInstance(type) as View; view.Layer = classAttribute.Layer; return view; } public void Test() { View login = CreateView(typeof(LoginView)); View alert = CreateView(typeof(AlertInfoView)); }
以上是关于Unity中使用Attribute的主要内容,如果未能解决你的问题,请参考以下文章
detectron2报AttributeError: Attribute ‘evaluator_type‘ does not exist in the metadata of dataset(代码片段
2019.10.26 Unity 特性(Attribute)
项目启动报错Failed to configure a DataSource: 'url' attribute is not specified and no embedde(代码片段