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數值:

運行后:

1 using UnityEngine; 2 using System.Collections; 3 using System; 4 5 public class test : MonoBehaviour { 6 public ClassToSerialize classSerialize;// = new ClassToSerialize() 7 void Start () { 8 classSerialize = new ClassToSerialize();//這里實例化 9 print(classSerialize.id + classSerialize.getname); 10 } 11 } 12 13 [Serializable] 14 public class ClassToSerialize 15 { 16 public int id = 120; 17 // [NonSerialized] 18 protected string name = "tongtong1989"; 19 public string getname 20 { 21 get { return name; } 22 } 23 }
當然,您也可以不在Start()中實例化,因為已經Serializable了,如下所示:

不過,您不可以把[Serializable]也注釋掉,那樣的話,類就不能序列化,默認初始化為null,調用字段會提示空引用異常!如下:

