了解序列化(Serialization)與文件讀寫
在 Unity 中,序列化(Serialization)是將物件的狀態轉換為可以儲存或傳輸的格式的過程。序列化可以用於保存遊戲狀態、設置或其他需要持久化的數據。文件讀寫是指將這些序列化數據寫入文件或從文件中讀取數據。
1. 序列化(Serialization)概述
序列化通常將物件轉換為 JSON、XML、或二進位格式。在 Unity 中,序列化的主要用途包括:
- 保存和載入遊戲數據:如玩家的進度、設置等。
- 存儲設置和配置:例如,關於遊戲的配置文件。
- 傳輸數據:在網絡遊戲中傳輸玩家的狀態或其他數據。
2. Unity 的序列化支持
Unity 支持多種序列化格式,包括:
- JSON:輕量級的數據交換格式,易於閱讀和編寫。
- XML:標記語言,用於儲存結構化數據。
- 二進位:將數據轉換為二進位格式,通常比文本格式更有效率。
3. 使用 JSON 進行序列化
JSON 是一種常見的序列化格式,適合用於保存和讀取遊戲數據。
步驟 1:定義數據結構
- 創建可序列化的類
- 定義一個 C# 類來儲存需要序列化的數據。例如:
1 2 3 4 5 6 7
[System.Serializable] public class PlayerData { public string playerName; public int playerScore; public float playerLevel; }
確保使用
[System.Serializable]
屬性來標記需要序列化的類。
步驟 2:將數據轉換為 JSON
使用 JsonUtility 進行序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
using UnityEngine; public class JsonExample : MonoBehaviour { public void SaveData(PlayerData data) { string json = JsonUtility.ToJson(data); System.IO.File.WriteAllText("playerData.json", json); Debug.Log("Data Saved"); } public PlayerData LoadData() { if (System.IO.File.Exists("playerData.json")) { string json = System.IO.File.ReadAllText("playerData.json"); PlayerData data = JsonUtility.FromJson<PlayerData>(json); Debug.Log("Data Loaded"); return data; } return null; } }
JsonUtility.ToJson
將物件轉換為 JSON 字符串。System.IO.File.WriteAllText
將 JSON 字符串寫入文件。System.IO.File.ReadAllText
從文件中讀取 JSON 字符串。JsonUtility.FromJson
將 JSON 字符串轉換回物件。
步驟 3:測試數據保存和讀取
在 Unity 編輯器中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
using UnityEngine; public class GameManager : MonoBehaviour { public JsonExample jsonExample; void Start() { PlayerData playerData = new PlayerData { playerName = "John", playerScore = 100, playerLevel = 1.0f }; jsonExample.SaveData(playerData); PlayerData loadedData = jsonExample.LoadData(); Debug.Log("Player Name: " + loadedData.playerName); Debug.Log("Player Score: " + loadedData.playerScore); Debug.Log("Player Level: " + loadedData.playerLevel); } }
4. 使用 XML 進行序列化
XML 是另一種常見的序列化格式。Unity 本身不直接支持 XML,但可以使用 .NET 的 XmlSerializer
類。
步驟 1:定義數據結構
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Xml.Serialization;
using System.IO;
[XmlRoot("PlayerData")]
public class PlayerData
{
[XmlElement("PlayerName")]
public string playerName;
[XmlElement("PlayerScore")]
public int playerScore;
[XmlElement("PlayerLevel")]
public float playerLevel;
}
步驟 2:將數據轉換為 XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class XmlExample : MonoBehaviour
{
public void SaveData(PlayerData data)
{
XmlSerializer serializer = new XmlSerializer(typeof(PlayerData));
using (FileStream fileStream = new FileStream("playerData.xml", FileMode.Create))
{
serializer.Serialize(fileStream, data);
}
Debug.Log("Data Saved");
}
public PlayerData LoadData()
{
if (File.Exists("playerData.xml"))
{
XmlSerializer serializer = new XmlSerializer(typeof(PlayerData));
using (FileStream fileStream = new FileStream("playerData.xml", FileMode.Open))
{
PlayerData data = (PlayerData)serializer.Deserialize(fileStream);
Debug.Log("Data Loaded");
return data;
}
}
return null;
}
}
5. 使用二進位格式進行序列化
二進位序列化是一種高效的數據格式,但不如 JSON 和 XML 直觀。
步驟 1:定義數據結構
1
2
3
4
5
6
7
[System.Serializable]
public class PlayerData
{
public string playerName;
public int playerScore;
public float playerLevel;
}
步驟 2:將數據轉換為二進位格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System.Runtime.Serialization.Formatters.Binary;
public class BinaryExample : MonoBehaviour
{
public void SaveData(PlayerData data)
{
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream fileStream = new FileStream("playerData.dat", FileMode.Create))
{
formatter.Serialize(fileStream, data);
}
Debug.Log("Data Saved");
}
public PlayerData LoadData()
{
if (File.Exists("playerData.dat"))
{
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream fileStream = new FileStream("playerData.dat", FileMode.Open))
{
PlayerData data = (PlayerData)formatter.Deserialize(fileStream);
Debug.Log("Data Loaded");
return data;
}
}
return null;
}
}
6. 小結
序列化和文件讀寫是遊戲開發中的重要技術,用於保存和讀取遊戲數據。Unity 提供了多種方法來實現序列化,包括 JSON、XML 和二進位格式。選擇合適的序列化方法取決於數據的複雜性、效率需求和可讀性要求。通過正確的實現,你可以輕鬆地管理遊戲數據並提高玩家體驗。
本文章以 CC BY 4.0 授權