首頁 >後端開發 >C++ >如何使用JSON和PlayerPrefs在Unity3D中堅固地保存和加載遊戲數據?

如何使用JSON和PlayerPrefs在Unity3D中堅固地保存和加載遊戲數據?

DDD
DDD原創
2025-01-31 18:06:12708瀏覽

How to Robustly Save and Load Game Data in Unity3D using JSON and PlayerPrefs?

Unity3D高效遊戲狀態保存方法

BinaryFormatter 方法在某些情況下(尤其是在 iOS 設備上)可能會遇到問題。它在反序列化期間依賴於類匹配,因此在更新或更改類後可能會導致數據丟失。此外,它還需要在 iOS 上添加環境變量以防止出現問題。

為了解決這些限制並提供更強大的解決方案,建議使用 PlayerPrefs 和 JSON 來保存遊戲狀態。 PlayerPrefs 提供了一種方便的機制,可以將少量數據作為鍵值對存儲,而 JSON (JavaScript Object Notation) 提供了一種結構化格式,可以輕鬆地將其轉換為對象並從對象轉換。

這種方法可以通過將 JSON 字符串轉換為字節數組,並使用 File.WriteAllBytesFile.ReadAllBytes 來讀寫數據來進一步增強。

以下是一個演示此技術的通用 DataSaver 類:

<code class="language-csharp">public class DataSaver
{
    // 保存数据
    public static void SaveData<T>(T dataToSave, string dataFileName)
    {
        string path = Path.Combine(Application.persistentDataPath, dataFileName + ".json"); // 使用 Application.persistentDataPath  保证数据持久性

        string jsonData = JsonUtility.ToJson(dataToSave, true);
        byte[] jsonBytes = Encoding.UTF8.GetBytes(jsonData); // 使用 UTF8 编码

        Directory.CreateDirectory(Path.GetDirectoryName(path) ?? ""); // 创建目录,处理空路径

        try
        {
            File.WriteAllBytes(path, jsonBytes);
            Debug.Log("数据已保存到: " + path);
        }
        catch (Exception e)
        {
            Debug.LogError("保存数据失败: " + path + "\n错误信息: " + e.Message);
        }
    }

    // 加载数据
    public static T LoadData<T>(string dataFileName)
    {
        string path = Path.Combine(Application.persistentDataPath, dataFileName + ".json");

        if (!File.Exists(path))
        {
            Debug.Log("文件不存在: " + path);
            return default(T);
        }

        byte[] jsonBytes = null;
        try
        {
            jsonBytes = File.ReadAllBytes(path);
            Debug.Log("数据已加载自: " + path);
        }
        catch (Exception e)
        {
            Debug.LogError("加载数据失败: " + path + "\n错误信息: " + e.Message);
            return default(T);
        }

        string jsonData = Encoding.UTF8.GetString(jsonBytes); // 使用 UTF8 编码

        return JsonUtility.FromJson<T>(jsonData);
    }
}</code>

此類使用方法如下:

<code class="language-csharp">// 要保存的示例类
[Serializable]
public class PlayerInfo
{
    public List<int> IDs = new List<int>();
    public List<int> Amounts = new List<int>();
    public int Life = 0;
    public float HighScore = 0;
}

// 保存数据
PlayerInfo saveData = new PlayerInfo();
saveData.Life = 99;
saveData.HighScore = 40;
DataSaver.SaveData(saveData, "playerData");

// 加载数据
PlayerInfo loadedData = DataSaver.LoadData<PlayerInfo>("playerData");
if (loadedData != null)
{
    Debug.Log("生命值: " + loadedData.Life);
    Debug.Log("最高分: " + loadedData.HighScore);
}</code>

此示例改進了錯誤處理,使用了更通用的類型 T,並使用了 Application.persistentDataPath 來確保數據持久性,並修正了編碼問題。 記住在你的 PlayerInfo 類上添加 [Serializable] 屬性。

以上是如何使用JSON和PlayerPrefs在Unity3D中堅固地保存和加載遊戲數據?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn