Unity+TikTokLive库导出JSON仅保留单个字典值的问题排查
解决Unity中Dictionary与JSON持久化只保留最后一条数据的问题
核心问题分析
你遇到的问题本质是旧数据加载逻辑错误,导致每次处理礼物时都是基于空字典更新,最终仅保留最后一次修改;另外字典初始化位置错误会直接清空已加载的历史数据。
修正后的完整实现
以下是可直接替换的GiftRow类核心代码,按步骤解决问题:
1. 字典初始化与加载逻辑
保持类级别的字典声明,确保先初始化空字典再加载历史数据:
private Dictionary<string, int> usersCoinsTotal; private void Awake() { // 先初始化空字典,再加载旧数据合并 usersCoinsTotal = new Dictionary<string, int>(); LoadFromFile(); }
2. 正确的历史数据加载方法
确保读取文件时,将旧数据合并到现有字典,而非直接覆盖:
private void LoadFromFile() { string savePath = Path.Combine(Application.persistentDataPath, "giftCoins.json"); if (File.Exists(savePath)) { string json = File.ReadAllText(savePath); // 推荐用Newtonsoft.Json(Unity包管理器可安装)直接序列化字典,比自带JsonUtility更方便 var loadedData = JsonConvert.DeserializeObject<Dictionary<string, int>>(json); if (loadedData != null) { foreach (var kvp in loadedData) { if (usersCoinsTotal.ContainsKey(kvp.Key)) { usersCoinsTotal[kvp.Key] = kvp.Value; } else { usersCoinsTotal.Add(kvp.Key, kvp.Value); } } } } }
3. 礼物更新与序列化逻辑
确保每次更新后序列化完整字典,而非仅当前用户数据:
public void OnGiftUpdateCoins(string userName, int giftCoins) { if (usersCoinsTotal.ContainsKey(userName)) { usersCoinsTotal[userName] += giftCoins; } else { usersCoinsTotal.Add(userName, giftCoins); } // 更新后立即保存完整字典 ExportSaveObjectsToJson(); } private void ExportSaveObjectsToJson() { string savePath = Path.Combine(Application.persistentDataPath, "giftCoins.json"); string json = JsonConvert.SerializeObject(usersCoinsTotal, Formatting.Indented); File.WriteAllText(savePath, json); }
4. 退出时的冗余保存保障
保留退出时的保存逻辑,确保异常退出也能留存数据:
private void OnApplicationQuit() { ExportSaveObjectsToJson(); }
关键注意事项
- 避免JsonUtility局限:Unity自带的
JsonUtility不支持直接序列化Dictionary,必须用包装类或直接使用Newtonsoft.Json(更高效)。 - 使用正确存储路径:必须用
Application.persistentDataPath作为保存目录,这是Unity官方推荐的持久化存储路径,避免权限或路径找不到的问题。 - 初始化顺序不能乱:先创建空字典,再加载旧数据,否则历史数据会被空字典覆盖。
验证步骤
- 测试给多个用户多次送礼,运行时检查字典内的键值对是否正确累加
- 关闭游戏后,找到
Application.persistentDataPath下的giftCoins.json文件,查看是否包含所有用户的累计金币值
内容的提问来源于stack exchange,提问作者Granny
相关产品推荐
相关产品推荐

