首页 > 后端开发 > C++ > 如何使用JSON和PlayerPrefs在Unity3D中坚固地保存和加载游戏数据?

如何使用JSON和PlayerPrefs在Unity3D中坚固地保存和加载游戏数据?

DDD
发布: 2025-01-31 18:06:12
原创
762 人浏览过

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 类:

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);
    }
}
登录后复制

此类使用方法如下:

// 要保存的示例类
[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);
}
登录后复制

此示例改进了错误处理,使用了更通用的类型 T,并使用了 Application.persistentDataPath 来确保数据持久性,并修正了编码问题。 记住在你的 PlayerInfo 类上添加 [Serializable] 属性。

以上是如何使用JSON和PlayerPrefs在Unity3D中坚固地保存和加载游戏数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板