Unity3D中的序列化测试
Unity3D中序列化字段常使用[SerializeField],序列化类常采用[System.Serializable],非序列化采用[System.NonSerialized]。
序列化类使用时发现一些区别。测试如下:
(1)

将脚本第一次拖拽到场景中后,运行程序。发现,对类进行序列化后,id,name会保持在代码中写的字段值。
如果我们退出运行,对检视面板的值进行修改,再运行,如下图所示。那么会始终运行检视面板中修改的值!

如果我们退出运行,对代码中的值进行修改,再运行,如下图所示。那么发现print的值还是运行检视面板中的值!如下图所示:

由此可见,序列化类后,显示的数值由检视面板的值确定。脚本中的数值只是在第一次拖拽脚本到游戏对象时有用。
套用C#书上的一句话:序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。
如果不想序列化某个类的字段,有两种方式:第一个就是可以用System.NonSerialized。增加了这个属性的字段不会在检视面板中显示。如下:

第二个方式就是将字段的访问修饰符设置为private或protected即可,如下所示,由于字段为私有或保护,只能在类内或派生的类中访问。这里采用属性getname获取name的值,并print。

一开始我把public ClassToSerialize classSerialize = new ClassToSerialize();的new部分放在Start()中,这时,不管有没有[Serializable],数值都会以类中写入的初始值决定。原因就是:Start()在字段赋予初始值之后运行的。如下所示:
没有运行时,修改id数值:

运行后:

using UnityEngine;
using System.Collections;
using System; public class test : MonoBehaviour {
public ClassToSerialize classSerialize;// = new ClassToSerialize()
void Start () {
classSerialize = new ClassToSerialize();//这里实例化
print(classSerialize.id + classSerialize.getname);
}
} [Serializable]
public class ClassToSerialize
{
public int id = ;
// [NonSerialized]
protected string name = "tongtong1989";
public string getname
{
get { return name; }
}
}
当然,您也可以不在Start()中实例化,因为已经Serializable了,如下所示:

不过,您不可以把[Serializable]也注释掉,那样的话,类就不能序列化,默认初始化为null,调用字段会提示空引用异常!如下:

Unity3D中的序列化测试的更多相关文章
- c# 与 Unity3d 中的序列化
圣典中对于Unity3D的序列化介绍很容易和C#的序列化介绍搞混,做个笔记,方便以后查找. 很多资料算是拾人牙慧. 一.Serializable 序列化 Inherits from Attribute ...
- Net中JSON序列化和反序列化处理(日期时间特殊处理)
0 缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...
- 【吐血推荐】简要分析unity3d中剪不断理还乱的yield
在学习unity3d的时候很容易看到下面这个例子: void Start () { StartCoroutine(Destroy()); } IEnumerator Destroy(){ yield ...
- Unity3D中事件函数的运行顺序
Unity3D中脚本的生命周期是依照预先定义好的事件函数的运行流程来演化的,详细流程例如以下: Editor模式下Reset: 当脚本第一次被挂到GameObject上或用户点击Resetbutton ...
- Unity3D中关于场景销毁时事件调用顺序的一点记录
先说一下我遇到的问题,我弄了一个对象池管理多个对象,对象池绑定在一个GameObject上,每个对象在OnBecameInvisible时会进行回收(即移出屏幕就回收),但是当场景切换或停止运行程序时 ...
- Unity3D 中材质球(Material)预制体打包成AB(AssetBundle)出现材质丢失问题的解决方案
关于Unity3D中打AB(AssetBundle)资源包,默认是不连Shader一同打包进去的,所以得自行添加,添加方式比较简单,不需要往项目中添加Shader,只是点选一下就可以了,具体实现方式如 ...
- UE4/Unity3D中同时捕获多高清摄像头的高效插件
本文主要讲实现过程的一些坑. 先说下要实现的目标,主要功能在UE4/Unity中都要用,能同时捕获多个摄像头,并且捕获的图片要达到1080p25桢上,并且需要经过复杂的图片处理后丢给UE4/Unity ...
- java中的序列化
遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化c,seri ...
- (转)Unity3d中的碰撞检测
很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作.这时,我们就需要检测到碰撞现象,即碰撞检测.这一篇,我来具体谈谈自 ...
随机推荐
- Timer与AlarmManager的差别
线程 通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可执行)状态.但此时并没有执行,它须要CPU时间片. 一旦得到CPU时间片.就会执行run()方法. run()的 ...
- jquery json ajax三级联动
province_city_area.jsp <%@ page language="java" pageEncoding="UTF-8"%> < ...
- [Python]网络爬虫(五):urllib2的使用细节与抓站技巧(转)
1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用代理. 新建test ...
- X-Forwarded-For的一些理解
X-Forwarded-For 是一个 HTTP 扩展头部,主要是为了让 Web 服务器获取访问用户的真实 IP 地址(其实这个真实未必是真实的,后面会说到). 那为什么 Web 服务器只有通过 X- ...
- 键盘事件keydown、keypress、keyup随笔整理总结
英文输入法: 事件触发顺序:keydown - > keypress - > keyup 中文输入法: firfox:输入触发keydown,回车确认输入触发keyup chr ...
- 工作总结 MVC 验证 [Required] 必填 与 string 小知识
例如 添加页面有个 title 字段 设置了 [Required] 不填的时候 设置 还是验证不通过 设置为 还是不通过 说明了 验证只与页面上传不传值有关 与在后台设不设置值 无关. ...
- go学习笔记(3) -- package fmt
package fmt fmt包实现了格式化的I/O函数,这点类似C语言中的printf和scanf,但是更加简单,其中的格式“占位符”衍生自 C 占位符 一般占位符 布尔占位符 浮点数及其复合构成占 ...
- 安装完SqlServer2008,wamp服务器无法启动的问题
"开始"->"程序"->Microsoft SQL Server 2008->配置工具->SQL Server配置管理器->SQL ...
- PixelLink
简介 论文题目:PixelLink: Detecting Scene Text via Instance Segmentation 论文地址:https://arxiv.org/abs/1801.01 ...
- git 录制简单实用好工具 LICEcap
官网 https://www.cockos.com/licecap/ 界面如图: 录制效果如下: