# [Unity Engine] SerializeField屬性
###### tags: `Unity Engine` `C#` `Programming`
先前看到有人在`private`變數上使用了`SerializeField`這個屬性(Attribute)。
```C#=
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`,怎麼想都跟這屬性的名稱打不著關係。
於是我去查了[官方文件](https://docs.unity3d.com/ScriptReference/SerializeField.html),發現到我對Unity這套軟體一直沒想過的問題...
- **Unity Engine是怎麼判定我們寫的腳本可以製造這些欄位供使用者在Inspector裡面進行編輯的?**
以下為官方文件的整理:
1. Unity只會對`public`變數進行序列化。
2. ==Unity會序列化所有腳本元件,然後重組新的組譯代碼,最後再製作出新的腳本元件==
3. 不能對`static`變數或屬性(properties)進行序列化,`private`變數可以在加上`[SerializeField]`後進行序列化。
4. 以下為Unity可以序列化的變數 **(在Inspector中看到可編輯欄位)**
1. 所有繼承`UnityEngine.Object`的`class`
2. `int`、`float`、`string`這些基礎型別
3. 一些Unity的內建型別,例如`Vector2`
4. 存有**可序列化**屬性的`List`和`Array`
5. Enums
6. Struct
序列化
---
上述提到了一個重要的關鍵字 - **序列化**
在Unity裡,序列化的意思是,將遊戲物件轉化成可以儲存或用於傳輸的資料。
參考資料
---
[Unity官方API](https://docs.unity3d.com/ScriptReference/SerializeField.html)