本章我们将依然讲解Unity中的Attribute,继续命名空间在UnityEngine里的。

PropertyAttribute,这个特性主要来控制变量或者类在Inspector里面的显示方式。和PropertyDrawer类挂钩,具体用法我将在之后开一系列讲解UnityEditor的文章中讲解。

Range,这个特性很好理解。给值类型一个范围, 代码如下:

在监视面板里,我们将会看到10的初始值,只要一动滑条,你的值就被限制在0-2之间了。

RequireComponent,自动添加所需的component,这个用来避免一些存在依赖关系而导致的错误。

如代码:

或者

在监视器里会自动产生依赖项:

如果你想要删除Test脚本,会报错。这个属性默认的构造函数,参数支持1-3个component,如果太多,可以分开写。

我们继续修改代码:

如果两个类有继承关系,也不能添加:

不过一般情况下,我们手动也无法添加两个有继承关系的组件,这不难理解。

RuntimeInitializeOnLoadMethod,这个属性时Unity5.0后新加的一个特性。如果好好利用起来,这个特性将会非常有用。

比如我们启动游戏的时候,会写一些数据的初始化工作,这些类不需要作为一个monobehaviour存在,但我们需要一个程序入口来驱动,所以不得不用一个GameObject来作为GameEntry。这个特性就可以做到。

首先我们写一个普通类,没有从Mono继承,代码如下:

public class RuntimeLoad
{
[RuntimeInitializeOnLoadMethod]
static void OnRuntime1 ()
{
Debug.Log("On Run Time 1");
} [RuntimeInitializeOnLoadMethod]
static void OnRuntime2()
{
Debug.Log("On Run Time 2");
} [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void OnRuntime3()
{
Debug.Log("On Run Time 3");
} [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
static void OnRuntime4()
{
Debug.Log("On Run Time 4");
}
}

需要注意,这个特性必须在静态函数上面插入,否则不会生效。可以看到这是一个正常的C#类,不加特性的情况下,肯定不会自动执行。

其中OnRunTime1和2都是没有参数的,完全一致,我们用来验证系统的执行顺序,然后3和4加了参数,可以看出一个是场景加载前,一个场景加载后。

RuntimeInitializeOnLoadMethod也可以加在monobehaviour上,为了验证调用顺序,我们在Hierarchy窗口的最上面的一个GameObject(之后统一称为GO)和最下面的GO上分别添加了两个脚本,这两个脚本都会在Awake, OnEnable和Start中输出,其次加了三个静态函数,和上述OnRuntime2,3,4一致。这里代码省略了。

然后运行程序,可以看到:

首先输出的带场景加载之前参数的,不论常规类还是unity组件的,然后是Awake和OnEnable,紧接着不加参数的特性和加了场景加载之后参数的一起输出,最后是Start方法。

总结:

1),加了BeforeSceneLoad参数的先输出,非Monobehaviour的类最先输出,然后是在Hierarchy窗口中位置靠下的输出,最后是位置靠上的输出。

2),这时候进入了LoadScene阶段,因此会调用Awake和OnEnable方法,还是位置下面的先调用。

3),这时候,加了AfterSceneLoad参数的开始输出。顺序和1)一样。没有加参数的同加了AfterSceneLoad的。

4),Start方法被调用。

相信看完这个实例后,对于这个特性的用法大家都了然于心了。

 SelectionBase,关于这个特性,先看操作:

新建一个GameObject1,建一个子节点GameObject2,再建一个Cube作为GO2的子节点。

注意GO1和GO2都是空的GO。

在Scene里面选择我们刚才创建的Cube,选中后的状态是:

系统会默认选择Cube。现在我们在GO2上加了一个配置信息,需要经常改变,如果一直定位在Cube上就太麻烦了。有两种解决办法,一种是手动去选。。。还有一种就是用SelectionBase。

新建一个脚本,代码如下:

将其附加到GO2物体上,然后再次重复选择操作。

可以看到GO2先被选中了,再点击的话能够轮询到Cube。因此SelectionBase的作用可以让没有实体的GO被选中。

我们在GO1上也加一个SelectionBase,再次点击,还是只能选中GO2,多次点击也无法选到GO1,我把GO2的脚本移除就可以点到GO1了。

我猜测,SelectionBase可能在同一根目录物体下,只有一份会起作用。因此我修改了场景里的物件如下:

其中GO1,GO2,GO2(1)都带有selectionbase特性。一次点击,可以看到如下顺序:

然后就跳出根目录了,基本上验证了我的猜想,这个点需要注意一下。

其实Unity自己封装了一个可选组件:

这个组件基本功能是一样的,它的功能更多一点,可以做一些交互的响应等。如果没有特殊需求不建议用这个。

 SharedBetweenAnimators,这个特性只能作用于派生自StateMachineBehaviour的类,指定该类仅会实例化一次,并且在所有的Animator实例之间共享,可以减少每个控制器实例的内存占用。注意,如果你的StateMachineBehaviour更改了一些成员变量,它将影响所有使用它的Animator实例。

Space,用于在Inspector面板上的参数之间加空行。

其中space的参数为高度,也可以不加。

TextArea,默认string在Inspector面板上的显示一行

添加TextArea可以变成一块更灵活的文本编辑区

可选参数可以设置最小和最大行数。并且不能用于非string类型。

ToolTip可以在Inspector参数上添加一个悬浮提示。修改代码如下:

鼠标悬浮在在Inspector面板可以看到:

UnityAPICompatibilityVersion,声明一个程序集与特定的Unity API兼容。由内部工具使用,确定程序集是否能够使用旧的UNITY API。

一般用不到,想了解详情的同学可以去

https://blogs.unity3d.com/cn/2015/01/06/assemby-updater-faster-api-usage-detection/

https://blogs.unity3d.com/cn/2014/06/23/unity5-api-changes-automatic-script-updating/

这两篇文章看一下。

至此我们在UnityEngine命名空间下的Attribute都讲完了,因为实在太多,UnityEditor命名空间下的Attribute我们将在下一篇文章进行讲解。

从Unity中的Attribute到AOP(七)的更多相关文章

  1. 从Unity中的Attribute到AOP(五)

    今天主要来讲一下Unity中带Menu的Attribute. 首先是AddComponentMenu.这是UnityEngine命名空间下的一个Attribute. 按照官方文档的说法,会在Compo ...

  2. 从Unity中的Attribute到AOP(四)

    本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b). 首先是Serializable,SerializeField以及NonSerialized,H ...

  3. 从Unity中的Attribute到AOP(三)

    上一篇我们对系统的Attributes进行了MSIL代码的查看,了解到了其本质就是一个类的构造函数.本章我们将编写自己的Attributes. 首先我们定义书的属性代码,如下: [AttributeU ...

  4. 从Unity中的Attribute到AOP(六)

    本文将重点对Unity剩下常用的Attribute进行讲解,其他不常用的Attribute各位可以自行去官方文档查阅. 首先是UnityEngine命名空间下的. ColorUsage,这个主要作用于 ...

  5. 从Unity中的Attribute到AOP(八)

    本文将讲一下在UnityEditor命名空间下的一些特性. CallBackOrder,这个Attribute是所有带callback index的Attribute的基类,由于官方也没有给出详细的说 ...

  6. 从Unity中的Attribute到AOP(二)

    上一篇文章我们初步了解了一下Attributes的含义,并且使用系统自带的Attributes写了点代码.在进一步解剖我们的代码之前,我觉得有个概念可能需要巩固一下:什么是元数据? 我们知道C#代码会 ...

  7. 从Unity中的Attribute到AOP(一)

    首先来看一下微软官方对Attributes(C#)的定义: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/conce ...

  8. Unity中使用Attribute

    Attribute是c#的语言特性 msdn说明如下: The Attribute class associates predefined system information or user-def ...

  9. Unity应用架构设计(12)——AOP思想的实践

    想象一下,当程序所有的业务逻辑都完成的时候,你可能还来不及喘口气,紧张的测试即将来临.你的Boss告诉你,虽然程序没问题,但某些方法为什么执行这么慢,性能堪忧.领会了Boss的意图之后,漫长的排查问题 ...

随机推荐

  1. 以流方式读写文件:文件菜单打开一个文件,文件内容显示在RichTexBox中,执行复制、剪切、粘贴后,通过文件菜单可以保存修改后的文件。

    MainWindow.xaml文件 <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&q ...

  2. 关于chrome浏览器的帐号密码和背景色的填充问题

    不知道大家平时做项目的时候有木有关注这个问题,其实之前做项目遇到过类似的问题,但是因为是单独的chrome浏览器的填充,而且是样式问题稍微严重点,也就没在意.然而在近期的项目中有遇到了这个问题,最为一 ...

  3. Mac ssh 连接报错 Permission denied (publickey)

    用的阿里云服务器,如果直接连接,会报下面错误: $ ssh root@47.94.132.115 Permission denied (publickey). 创建服务器的时候,连接秘钥会生成并下载到 ...

  4. url特殊字符转义及解决方法

    URL特殊字符需转义 1.空格换成加号(+) 2.正斜杠(/)分隔目录和子目录 3.问号(?)分隔URL和查询 4.百分号(%)制定特殊字符 5.#号指定书签 6.&号分隔参数 转义字符的原因 ...

  5. redis的pipeline操作

    1.简单描述 redis是一个CS模式的tcp的server,一个client发起了命令操作的请求,然后会阻塞等待服务端的处理和数据的返回.基本上一个命令请求就是2个报文,一去一回.如果多个命令,每次 ...

  6. iOS UI特效

    1.iOS特效 a.对应APP中的基本动作分三类: 1.指向性动效(滑动,弹出等) 2.提示性动效(滑动删除,下拉刷新等) 3.空间扩展(翻动,放大等) b.这类动效在设计过程中需要主意几点: 1.系 ...

  7. Mac 终端—不同文件不同颜色显示,提示文字

    原文地址 修改Mac终端(Terminal)里不同类型文件的显示颜色 修改Mac终端(Terminal)的提示文字 Mac终端显示/隐藏文件命令 1. 修改Mac终端(Terminal)里不同类型文件 ...

  8. [Maven] Missing artifact

    今天从朋友那拷过来一个maven工程,eclipse中maven配置好了,maven仓库也配置完毕,但是一直报Missing artifact,然后开网执行maven update,下载完jar后,还 ...

  9. [置顶] xamarin android Fragment实现底部导航栏

    前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment  Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...

  10. Errors are values

    原文地址 https://blog.golang.org/errors-are-values Go程序员之间(特别是这些刚接触Go语言的新人)一个常见的讨论点是如何处理错误.谈话经常变成为对如下代码序 ...