SerializeField和Serializable

Serialize功能

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

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

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

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

1. public 变量

在没有加入任何Attribute的前提下,public变量是默认被视为可以被Serialize的。所以public声明的变量在Inspector面板中是可见的。 
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 int ID; 
SerializeField和Serializable

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进行序列化,不可以对属性序列化

代码1:添加Serializable特性 
SerializeField和Serializable 
结果1: 
SerializeField和Serializable 
代码2:不添加Serializable特性 
SerializeField和Serializable 
结果2: 
SerializeField和Serializable

所以,如果class添加Serializable特性之后,定义为public变量会在Inspector面板上面显示,否则即使是public类型的变量,也无法在Inspector面板上面显示。