Unity CloudSave与本地双系统适配:GameData序列化问题求助
解决Unity CloudSave加载后JSON格式错误与GameData解析问题
问题根源
你当前的代码存在三个核心错误:
- 错误移除了JSON字符串首尾的
{},破坏了JSON的完整结构 - 对云端返回的已有JSON字符串再次调用
JsonConvert.SerializeObject,导致字符串被额外转义包裹,生成无效格式 - 使用
JsonUtility.FromJson解析不完整的JSON,无法正确映射到GameData类型
修正方案
以下是修正后的LoadData方法代码,同时实现获取正确JSON字符串和生成GameData实例的需求:
public static async void LoadData() { if (counter == 0) { await UnityServices.InitializeAsync(); await AuthenticationService.Instance.SignInAnonymouslyAsync(); counter++; } data = await CloudSaveService.Instance.Data.LoadAsync(new HashSet<string> { PLAYER_CLOUD_KEY}); // 1. 获取云端存储的完整JSON字符串(本身就是带{}的合法格式) string cloudJson = data[PLAYER_CLOUD_KEY]; myJson = cloudJson; // 这就是符合本地要求的完整JSON // 2. 将JSON解析为GameData实例(二选一即可) // 方式一:使用Unity自带的JsonUtility(需GameData标记[Serializable]) gameData = JsonUtility.FromJson<GameData>(cloudJson); // 方式二:使用Newtonsoft.Json(如果需要更复杂的序列化支持) // gameData = JsonConvert.DeserializeObject<GameData>(cloudJson); Debug.Log($"合法JSON格式: {myJson}"); Debug.Log($"解析后的GameData: Panda={gameData.Panda}, Peacock={gameData.Peacock}"); }
关键说明
- CloudSave存储的
PLAYER_CLOUD_KEY对应的值,本身就是你当初上传的完整GameData序列化JSON(带{}),不需要做任何Trim操作 - 直接使用原始JSON即可同时满足:本地文件写入的格式要求,以及
GameData的解析需求 - 若你是通过CloudSave上传数据,确保上传时也是将完整的
GameData序列化JSON存入,示例上传代码:
public static async void SaveDataToCloud(GameData saveData) { // 将GameData序列化为完整JSON string saveJson = JsonUtility.ToJson(saveData); // 上传到CloudSave await CloudSaveService.Instance.Data.SaveAsync(new Dictionary<string, string> { { PLAYER_CLOUD_KEY, saveJson } }); // 同时写入本地文件 File.WriteAllText(Application.persistentDataPath + "/savefile.json", saveJson); }
本地文件写入验证
修正后生成的myJson格式会和你要求的一致:
{ "Panda":false, "Peacock":false, "RedPanda":false, "Sloth":false, "Tapir":false }
此时用File.WriteAllText写入本地文件,不会出现清空数据的问题。
内容的提问来源于stack exchange,提问作者Sirhot Bay
相关产品推荐
相关产品推荐

