文章

了解序列化(Serialization)與文件讀寫

在 Unity 中,序列化(Serialization)是將物件的狀態轉換為可以儲存或傳輸的格式的過程。序列化可以用於保存遊戲狀態、設置或其他需要持久化的數據。文件讀寫是指將這些序列化數據寫入文件或從文件中讀取數據。

1. 序列化(Serialization)概述

序列化通常將物件轉換為 JSON、XML、或二進位格式。在 Unity 中,序列化的主要用途包括:

  • 保存和載入遊戲數據:如玩家的進度、設置等。
  • 存儲設置和配置:例如,關於遊戲的配置文件。
  • 傳輸數據:在網絡遊戲中傳輸玩家的狀態或其他數據。

2. Unity 的序列化支持

Unity 支持多種序列化格式,包括:

  • JSON:輕量級的數據交換格式,易於閱讀和編寫。
  • XML:標記語言,用於儲存結構化數據。
  • 二進位:將數據轉換為二進位格式,通常比文本格式更有效率。

3. 使用 JSON 進行序列化

JSON 是一種常見的序列化格式,適合用於保存和讀取遊戲數據。

步驟 1:定義數據結構

  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

  1. 使用 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:測試數據保存和讀取

  1. 在 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 授權