Unity3D中的Attribute详解(四)
本篇我们将逐一讲解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上当然是无法显示的。这个区别各位需要注意一下。
Unity3D中的Attribute详解(四)的更多相关文章
- C#中的Attribute详解(下)
原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...
- Unity3D中的Coroutine详解
Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...
- 【Unity3D/C#】Unity3D中的Coroutine详解
Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...
- js中的attribute详解
Attribute是属性的意思,文章仅对部分兼容IE和FF的Attribute相关的介绍.attributes:获取一个属性作为对象getAttribute:获取某一个属性的值object.getAt ...
- android中的LaunchMode详解----四种加载模式
Activity有四种加载模式: standard singleTop singleTask singleInstance 配置加载模式的位置在AndroidManifest.xml文件中activi ...
- 深入浅出的webpack构建工具---devTool中SourceMap模式详解(四)
阅读目录 一:什么是SourceMap? 二:理解webpack中的SourceMap的eval,inline,sourceMap,cheap,module 三:开发环境和线上环境如何选择source ...
- “全栈2019”Java第八十四章:接口中嵌套接口详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- .Net Attribute详解(一)
.Net Attribute详解(一) 2013-11-27 08:10 by JustRun, 1427 阅读, 14 评论, 收藏, 编辑 Attribute的直接翻译是属性,这和Property ...
- oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...
- .Net Attribute详解(下) - 使用Attribute武装枚举类型
接上文.Net Attribute详解(上)-Attribute本质以及一个简单示例,这篇文章介绍一个非常实用的例子,相信你一定能够用到你正在开发的项目中.枚举类型被常常用到项目中,如果要使用枚举To ...
随机推荐
- go结构体打印格式化成json
需要用到json.MarshalIndent 方法 官方的注释是: MarshalIndent类似于Marshal,但应用Indent来格式化输出. 输出中的每个JSON元素都将以一个新行开始,该新行 ...
- Vue+Element UI一个下拉框传字典值和对应字典Label
<el-select @change="getDeptName" v-model="form.deptCode"> <el-option v- ...
- antv g6 出现 n.addEdge is not a function问题
问题描述直接上图 解决方式就是将edge里面边的source和target对应的id换成字符串类型就行. 例如: edges: [ { id: 299, source": 3629.toSt ...
- oracle 用户连接数查询
oracle 用户连接数查询 --当前的连接数 select count(*) from v$session; --数据库允许的最大连接数 select value from v$parameter ...
- Matlab %肆
第四章:Graph Plot form 'Data' plot(x,y); plot(y); %x = [1-n], n = length(y) EG1: plot(cos(0:pi/20:2 ...
- hi,docker,docker的介绍
一.docker的介绍 1.什么是docker: docker是一种虚拟化技术,小型的系统环境(linux)2.虚拟化技术: 在计算机中用例管理虚拟资源的一种手段 内存管理.软件虚拟化.硬件虚拟化(磁 ...
- pip安装报错 cannot uninstall a distutils installed project
sudo pip install --ignore-installed xxx 在安装jupyter notebook的时候,遇到了这个问题,于是上网搜索,搜到了靠谱答案github解决方案 sudo ...
- 转发:Midway Serverless 发布 2.0,一体化让前端研发再次提效
自去年 Midway Serverless 1.0 发布之后,许多业务开始尝试其中,并利用 Serverless 容器的弹性能力,减少了大量研发人员对基础设施和运维的关注.对前端开发者而言,他们只需写 ...
- TAP 交换机
首发第一篇,就想分享一下TAP交换机的网络设备,为啥要谈这个呢,因为是一个冷门产品,大厂一般都没有,有也不作为重点产品推介,所以关注的人少,希望能给有这方面需求的人,又苦于找不到介绍资料的人以帮助.在 ...
- SQL字符匹配
一般形式 列名 [not] like 'str' 匹配串可以是以下四种通配符: 单下划线 _:匹配任意一个字符: %:匹配0个或多个字符: [ ]:匹配[ ]中的任意一个字符(若要比较的字符是连续的, ...