You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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官方推荐的持久化存储路径,避免权限或路径找不到的问题。
  • 初始化顺序不能乱:先创建空字典,再加载旧数据,否则历史数据会被空字典覆盖。

验证步骤

  1. 测试给多个用户多次送礼,运行时检查字典内的键值对是否正确累加
  2. 关闭游戏后,找到Application.persistentDataPath下的giftCoins.json文件,查看是否包含所有用户的累计金币值

内容的提问来源于stack exchange,提问作者Granny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 03:15:05