Serialize功能

Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系。

简单的说,在没有自定义Inspector的情况下所有显示在Inspector 中的属性都同时具有Serialize功能。

换句话说,就是你在Inspector看到什么,保存游戏的时候,这些值就会被保存成二进制文件。

本文说说可被Serialize的变量的定义方法

1. public 变量

在没有加入任何Attribute的前提下,public变量是默认被视为可以被Serialize的。

public int MaxExp;

2. [SerializeField] Attribute

强制unity去序列化一个私有域

这是一个内部的unity序列化功能,有时候我们需要Serialize一个private或者protected的属性,这个时候可以使用[SerializeField]这个Attribute:

[SerializeField]
protected int foobar = 0;

注意: 这样定义出的成员变量也是会在Inspector中显示出来。

在Unity最新的UI系统中,UI属性上方全部添加[SerializeField] ,如下所示

[SerializeField]
private Button btn1;

SerializeField参考文档:http://game.ceeger.com/Script/Attributes/SerializeField.html

3. 单独的class或struct

Serializable是.Net自带的序列化

有时候我们会自定义一些单独的class/struct, 由于这些类并没有从 MonoBehavior 派生所以默认并不被Unity3D识别为可以Serialize的结构。自然也就不会在Inspector中显示。我们可以通过添加 [System.Serializable]这个Attribute使Unity3D检测并注册这些类为可Serialize的类型。具体做法如下:

[System.Serializable]
public class FooBar {
public int foo = 5;
public int bar = 10;
}

注意:Serializable只可以对class,struct,enum,delegate进行序列化,不可以对属性序列化

4. ScriptableObject

ScriptableObject 类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便,具体请参考 [cb]ScriptableObject 序列化

NonSerialize的变量的定义方法

4.1. protected, private, internal 变量

默认情况下,protected, private, internal变量将不会被serialize.

4.2. [System.NonSerialized] Attribute

有时候我们需要定义一些public变量方便操作,但是又不希望这些变量保留。这个时候可以利用[System.NonSerialized]来完成这个操作:

[System.NonSerialized] public float foobar = 1.0f;

4.3. readonly, const, static 修饰符

如果变量加入了readonly, const, static等修饰符,无论他的serialize设置如何,都将不会进行serialize

4.4. Dictionary<T,K>

Unity3D可以对List<T>进行序列化显示,但是由于他们的程序员偷懒或不够强大,以至于我们到现在都不能serialize Dictionary<T,K>这么一个较为常用的类型。通常我们会通过Serialize一份List<T>,然后在 Awake中初始化Dictionary的方法来完成Dictionary的serialize操作。如:

[System.Serializable]
public class NameToID {
public string name = "";
public int ID = -1;
}
public List<NameToID> nameToIDList = new List<NameToID>();  
Dictionary<string,int> nameToID = new Dictionary<string,int>();  
//
void Awake () {
foreach ( NameToID info in nameToIDList ) {
nameToID[info.name] = info.ID;
}
nameToIDList = null; // put it null make garbage collect it (I wish)
}

在Inspector中的显示

变量在Inspector中会根据变量的大写字母来隔开来显示,并且会将首字母强制大写的方式显示。 如:

public int myFooBar = 0;

在GUI将会显示为: My Foo Bar

本文内容转载自:http://www.cnblogs.com/oldman/articles/2409523.html

SerializeField和Serializable的更多相关文章

  1. Unity中HideInInspector和SerializeField以及Serializable

    首先,Unity会自动为Public变量做序列化,序列化的意思是说再次读取Unity时序列化的变量是有值的,不需要你再次去赋值,因为它已经被保存下来. 然后是,什么样的值会被显示在面板上? 已经被序列 ...

  2. UnityEngine.SerializeField & System.Serializable

    [UnityEngine.SerializeField] Force Unity to serialize a private field. 强制Unity序列化一个私有变量. You will al ...

  3. Unity3D的SerializeField 序列化域名

    SerializeField Inherits from Attribute Force Unity to serialize a private field. 强制Unity去序列化一个私有域. Y ...

  4. 编辑器插件数据保存之Serializable

    Editor数据保存需求 做编辑器插件开发时,当打开一个窗口,对数值进行修改后,在关闭窗口或重新打开Unity时,希望能保存上次的数据. 相关知识 Serialization ,ScriptableO ...

  5. SerializeField和HideInInspector

    在Unity中,一个变量为公有类型,但是呢你不想让它显示在属性面板上,这个时候用 [HideInInspector] 这是隐藏的意思,举例: 用了[HideInInspector] 之后 就是这样用的 ...

  6. [System.Serializable],

    [System.Serializable]添加在类,枚举,结构前面,可以让该这些对象在inspector中显示 [SerializeField]是设置非public 成员对象在inspector中显示

  7. 对 Serializable和Parcelable理解

    1.首先他们两个接口都是为了实现对象的序列化,使之可以传递,所谓序列化就是将对象信息装换成可以存储的介质的过程. 2.Serializable是jdk所提供的序列化接口,该接口存在于io包下,可想用于 ...

  8. java.io.Serializable 序列化接口

    什么是序列化.反序列化? Serialization(序列化)是一种将对象以一连串的字节描述的过程: 反序列化deserialization是一种将这些字节重建成一个对象的过程. 序列化通俗一点说就是 ...

  9. serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法

    ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Ser ...

随机推荐

  1. 怎么通过activity里面的一个按钮跳转到另一个fragment(android FragmentTransaction.replace的用法介绍)

    即:android FragmentTransaction.replace的用法介绍 Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,他们之间最 ...

  2. Android自动更新安装后显示‘完成’‘打开’按钮

    /** * 安装apk * * @param url */ private void installApk() { File apkfile = new File(apkFilePath); if ( ...

  3. Android—Ormlite框架简单的操作数据库

    大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介 ...

  4. iOS仿京东分类菜单之UICollectionView内容

    在上<iOS仿京东分类菜单实例实现>已经实现了大部分主体的功能,本文是针对右边集合列表进行修改扩展,使它达到分组的效果,本文涉及到的主要是UICollectionView的知识内容,左边列 ...

  5. JAVA----编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符

    package com.pb.demo.packclass.demo1; import java.util.HashSet; /** * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符 ...

  6. Spring(四)Bean注入方试

    一.构造方法注入 定义:通过构造函数来完成依赖关系的设定 优缺点: 在构造对象的同时,完成依赖关系的建立 如果关联的对象很多,那和不得不在构造方法上加入过多的参数 基中有index:如果指定索引从0开 ...

  7. android media server 解析1-media player service 结构部分

    下面为media server注册的四个服务之一:MediaPlayerService的结构图 1.图中没有MediaPlayerService的代理对象BpMediaPlayerService部分, ...

  8. iOS之 PJSIP静态库编译(一)

    首先放上pjsip官方网站http://www.pjsip.org/download.htm 下载的时候注意while the .bz2 has LF line-ends and is for Uni ...

  9. mysql中FIND_IN_SET的使用方法

    在mysql中,有时我们在做数据库查询时,需要得到某字段中包含某个值的记录,但是它也不是用like能解决的,使用like可能查到我们不想要的记录,它比like更精准,这时候mysql的FIND_IN_ ...

  10. Asp.net 页面访问模板页的属性

    首先 页面需要添加下面一段代码 <%@ MasterType VirtualPath="~/User/User.Master" %> 添加的位置如图 这样就可以在这个页 ...