本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b)。

首先是Serializable,SerializeField以及NonSerialized,HideInInspector。

unity中默认public的变量都是可以序列化的,如:

为变量y加上可序列化的标识

可以看到离这个Attribute最近的私有变量被成功序列化。

我们去查看官方文档,是这么写的:

SerializeField将会强制去序列化一个私有域,但你将永远用不到它。这个序列化与.net的序列化功能没关系,是Unity内部的一个过程。它可以序列化共有的非静态域(可被序列化的类型),可以序列化非公有非静态域,不能序列化静态域,不能序列化属性。可被序列化的类型可以是所有继承自UnityEngine.Object的类型;所有基础类型,如int, string, float, bool;枚举,结构体,可被序列化对象的Array或者List。

需要注意的是,如果你放一个元素在List或者Array里放了两次,最终反序列化后,你将得到两份完全不同的拷贝,而不是原来的同一个元素。此外,字典不支持被序列化,你可以用List单独保存key和value,在Awake的时候,连接两者。

查看SerializeField从元代码,我们发现它可以被放到任何的字段上。修改代码如下:

跟没加一样,因为这是要去序列化SerializeTest这个类,而monobehaviour本身就可以被序列化。

所以我们最后的总结就是[SerializeField]可以将私有变量显示在Inspector面板上,但你一般用不到它。

继续修改我们的代码,如下:

虽然innerInst是public的,但是并没有显示在属性面板上,因为Inner这个类本身并不能被序列化。

如果我们在类声明的上面加上[SerializeField],会发现一点卵用也没有,这个Attribute并不能把类本身序列化。

这里就需要引入一个新的Attribute:[Serializable]

修改上述代码就可以看到咯:

我们查看Serializable的代码,发现它只能附着在类,结构体,枚举和委托上面。并且不能继承,不能多次使用。

这样写会在unity里报错。

很容易得出结论,Serializable是System命名下的一个Attribute,能把非序列化的类,结构体,枚举或者委托进行序列化,而SerializeField则是Unity自己定义的Attribute,用以标识是否在Inspector显示私有对象,这个私有对象必须可以被序列化。

还有一个[NonSerialized],虽然同样是System命名空间的属性,但更像是SerializeField的反义词。它的作用对象只能是Field字段。修改代码如下:

运行结果:

我们把NonSerialized改为[HideInInspector]会发现同样的结果,两者看起来完全一样。那他们内在的区别呢?

我们新建一个类,代码如下:

在同一个GameObject上添加两次Test,可以看到:

运行的时候:

然后我们修改Inspector面板上的其中一个字段,如下:

接下来我们修改代码如下:

再次运行程序,可以看到:

在面上赋予的值没有改变。我们把HideInInspector去掉,可以看到:

值依然存在。接着修改代码如下:

再次运行程序:

这次看到区别了,我们的值不见了。

把NonSerialized去掉后:

现在我们能看到这两者的差距了。总的来说,HideInInspector只管隐藏属性在Inspector面板上的显示与否,不会对序列化产生任何影响。而NonSerialized会使得当前变量直接变成不能序列化的对象,我们序列化后存储的值也丢失了。而不能序列化的对象在Inspector上当然是无法显示的。这个区别各位需要注意一下。

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

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

    本章我们将依然讲解Unity中的Attribute,继续命名空间在UnityEngine里的. PropertyAttribute,这个特性主要来控制变量或者类在Inspector里面的显示方式.和P ...

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

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

  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. 3D语音天气球(源码分享)——在Unity中使用Android语音服务

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

随机推荐

  1. GIS前端将选中的图形输出为Shapfile文件

    老师让我实现如题的功能,我对着ArcGIS js api找了半天,没有发现该方法接口,找了很多资料,前后问了三个前辈. 第一个前辈说用GP服务,我在ArcMap的工具箱里找到convert to la ...

  2. 自学Zabbix3.9.1-模板Templates-创建

    自学Zabbix3.9.1-模板Templates-创建 1. 模板介绍 模板是一组可以方便地应用于多个主机的实体. 实体可能是: 项目 触发器 图 应用程序 屏幕(因为Zabbix 2.0) 低层次 ...

  3. 让你用sublime写出最完美的python代码--windows环境

    至少很长一段时间内,我个人用的一直是pycharm,也感觉挺好用的,也没啥大毛病 但是pycharm确实有点笨重,啥功能都有,但是有很多可能这辈子我也不会用到,并且pycharm打开的速度确实不敢恭维 ...

  4. 微信小程序基于最新版1.0开发者工具分享-小试牛刀(视频)+发布流程

    第一章:小程序初级入门教程 小试牛刀[含视频] 视频地址:https://v.qq.com/x/page/i0554akzobq.html 这一章节中,我们尝试着写一个最简单的例子,包含 2 个静态页 ...

  5. VR、AR、MR定义区别

    近日, 获得谷歌5亿美元融资的技术公司Magic Leap在WSJD展会中放出了一段实录视频,引起不小骚动.如今,也有媒体称他们为MR公司,那么VR.AR.MR之间到底有什么区别呢. VR.AR.MR ...

  6. iOS常见的几种加密方法(base64.MD5.Token传值.系统指纹验证。。加密)

    普通加密方法是讲密码进行加密后保存到用户偏好设置中 钥匙串是以明文形式保存,但是不知道存放的具体位置 一. base64加密 base64 编码是现代密码学的基础 基本原理: 原本是 8个bit 一组 ...

  7. Spring拦截器总结

    本文是对慕课网上"搞定SSM开发"路径的系列课程的总结,详细的项目文档和课程总结放在github上了.点击查看 Spring过滤器WebFilter可以配置中文过滤 拦截器实现步骤 ...

  8. mysql5.7-Group Replication

    什么是Group Replication 基于组的复制(Group-based Replication)是一种被使用在容错系统中的技术.Replication-group(复制组)是由能够相互通信的多 ...

  9. ubuntu下加载mcypt

    mcrypt 是php 里面重要的加密支持扩展库,linux环境下:该库在默认情况下不开启.window环境下:PHP>=5.3,默认开启mcrypt扩展 1.命令行下载(不嫌麻烦可以到网上找安 ...

  10. redis centos启动

    转到redis目录 ./redis-server /usr/java/redis/redis.conf