Try   HackMD

[Unity Engine] SerializeField屬性

tags: Unity Engine C# Programming

先前看到有人在private變數上使用了SerializeField這個屬性(Attribute)。

unsing UnityEngine; // 給個範例 public class Character : MonoBehaviour { [SerializeField] private int HP; void Start() { } void Update() { } }

而後HP這個欄位在Unity Editor裡面,就像把變數設為public一樣,可供使用者在Inspector裡面,對該欄位進行修改。

發生了甚麼事

所以這個屬性就是把private變數改成public變數,然後可以像public變數一樣可以在Editor裡面進行改寫?

事情應該沒有那麼簡單,因為SerializeField這個名稱的意思是序列化欄位,把private改成public,怎麼想都跟這屬性的名稱打不著關係。

於是我去查了官方文件,發現到我對Unity這套軟體一直沒想過的問題

  • Unity Engine是怎麼判定我們寫的腳本可以製造這些欄位供使用者在Inspector裡面進行編輯的?

以下為官方文件的整理:

  1. Unity只會對public變數進行序列化。

  2. Unity會序列化所有腳本元件,然後重組新的組譯代碼,最後再製作出新的腳本元件

  3. 不能對static變數或屬性(properties)進行序列化,private變數可以在加上[SerializeField]後進行序列化。

  4. 以下為Unity可以序列化的變數 (在Inspector中看到可編輯欄位)

    1. 所有繼承UnityEngine.Objectclass
    2. intfloatstring這些基礎型別
    3. 一些Unity的內建型別,例如Vector2
    4. 存有可序列化屬性的ListArray
    5. Enums
    6. Struct

序列化

上述提到了一個重要的關鍵字 - 序列化

在Unity裡,序列化的意思是,將遊戲物件轉化成可以儲存或用於傳輸的資料。

參考資料

Unity官方API