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中的序列化测试的更多相关文章

  1. c# 与 Unity3d 中的序列化

    圣典中对于Unity3D的序列化介绍很容易和C#的序列化介绍搞混,做个笔记,方便以后查找. 很多资料算是拾人牙慧. 一.Serializable 序列化 Inherits from Attribute ...

  2. Net中JSON序列化和反序列化处理(日期时间特殊处理)

    0  缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...

  3. 【吐血推荐】简要分析unity3d中剪不断理还乱的yield

    在学习unity3d的时候很容易看到下面这个例子: void Start () { StartCoroutine(Destroy()); } IEnumerator Destroy(){ yield ...

  4. Unity3D中事件函数的运行顺序

    Unity3D中脚本的生命周期是依照预先定义好的事件函数的运行流程来演化的,详细流程例如以下: Editor模式下Reset: 当脚本第一次被挂到GameObject上或用户点击Resetbutton ...

  5. Unity3D中关于场景销毁时事件调用顺序的一点记录

    先说一下我遇到的问题,我弄了一个对象池管理多个对象,对象池绑定在一个GameObject上,每个对象在OnBecameInvisible时会进行回收(即移出屏幕就回收),但是当场景切换或停止运行程序时 ...

  6. Unity3D 中材质球(Material)预制体打包成AB(AssetBundle)出现材质丢失问题的解决方案

    关于Unity3D中打AB(AssetBundle)资源包,默认是不连Shader一同打包进去的,所以得自行添加,添加方式比较简单,不需要往项目中添加Shader,只是点选一下就可以了,具体实现方式如 ...

  7. UE4/Unity3D中同时捕获多高清摄像头的高效插件

    本文主要讲实现过程的一些坑. 先说下要实现的目标,主要功能在UE4/Unity中都要用,能同时捕获多个摄像头,并且捕获的图片要达到1080p25桢上,并且需要经过复杂的图片处理后丢给UE4/Unity ...

  8. java中的序列化

    遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化c,seri ...

  9. (转)Unity3d中的碰撞检测

    很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作.这时,我们就需要检测到碰撞现象,即碰撞检测.这一篇,我来具体谈谈自 ...

随机推荐

  1. CreateThread、_beginthreadex和AfxBeginThread .

    创建线程好几个函数可以使用,可是它们有什么区别,适用于什么情况呢?参考了一些资料,写得都挺好的,这里做一些摘抄和整合. [参考1]CreateThread, AfxBeginThread,_begin ...

  2. PHP关于进程池的优化

    本文打算从另一个角度来讨论问题,教大家如何配置高效的环境,如此同样能够达到优化的目的. pool 一个让人沮丧的消息是绝大多数 PHP 程序员都忽视了池的价值.这里所说的池可不是指数据库连接池之类的东 ...

  3. WPF基础学习第一天

    格式 1.XAML格式: <Button x:Name="btnClick" Content="按钮" HorizontalAlignment=" ...

  4. map reduce相关程序

    Test_1.java /** * Hadoop网络课程模板程序 * 编写者:James */ import java.io.IOException; import java.text.DateFor ...

  5. 玩转Masonry JS库来实现瀑布流Web效果

    工作项目中需要制作个Mobile上的Web App的展示,方便快捷访问和评价反馈.在展示页面能看到应用展示图,点击进入Web应用.我不是前端开发者,对HTML, CSS, JS这三剑客仅仅是略知一二. ...

  6. C# 采用钩子捕获键盘和鼠标事件-验证是否处于无人操作状态

    原文地址:https://www.cnblogs.com/gc2013/p/4036414.html 全局抽象类定义 using System; using System.Collections.Ge ...

  7. Python练习笔记——编写一个阶乘函数

    当输入一个数字时,函数自动计算该数的 阶乘 def factorial(num): j = 1 for i in range(1,num+1): j = j*i print(j) num = int( ...

  8. Android 在已有的项目上创建新的项目

    原工程 右键Copy   再右键点Paste 改新的工程名

  9. OAF_OAF增删改-新增的实现(案例)

    2014-09-14 Created By BaoXinjian

  10. Linux内核中锁机制之信号量、读写信号量

    在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...