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

Unity游戏启动时JSON存档无法正常加载问题求助

问题根因

  • 你当前的GetFromJSON方法是直接读取绑定的TextAsset CARS的内容,这个资源是Unity编辑器在导入时缓存的静态内容,运行时你修改磁盘上的txt文件不会自动更新这个TextAsset的缓存值
  • 编辑器下按Ctrl+R的本质是刷新项目资源库,Unity会重新读取磁盘上的CARS.txt更新TextAsset的内容,所以刷新后才能读到新值
  • 额外注意:Application.dataPath在打包发布后是只读路径,你写入的文件会直接报错存不上,正式环境一定要换可读写路径

修复方案

1. 统一读写路径,优先用持久化路径

把路径单独抽出来,优先用Application.persistentDataPath(各平台通用的可读写路径),首次运行如果持久化路径没有存文件,再读内置的TextAsset默认数据:

// 单独定义文件路径,避免硬编码写错
private string SaveFilePath => Path.Combine(Application.persistentDataPath, "CARS.txt");

如果需要编辑器下直接写入项目内的CARS.txt方便调试,可以加编译宏区分环境:

private string SaveFilePath 
{
    get 
    {
#if UNITY_EDITOR
        return Path.Combine(Application.dataPath, "CARS.txt");
#else
        return Path.Combine(Application.persistentDataPath, "CARS.txt");
#endif
    }
}

2. 重写GetFromJSON方法,直接读磁盘文件

不要读TextAsset的缓存,直接读取你写入的磁盘文件内容,首次运行没有存文件的时候再用默认的TextAsset数据初始化:

public void GetFromJSON()
{
    // 先判断持久化路径有没有已经存的文件
    if (File.Exists(SaveFilePath))
    {
        // 有就直接读磁盘上的最新内容
        string jsonContent = File.ReadAllText(SaveFilePath);
        myCars = JsonUtility.FromJson<CarList>(jsonContent);
    }
    else
    {
        // 首次运行没有存文件,用内置的默认TextAsset数据初始化
        myCars = JsonUtility.FromJson<CarList>(CARS.text);
        // 初始化后顺便存到持久化路径,下次启动就可以直接读
        SaveToJSON();
    }
    Debug.Log("GetFromJSON() called");
}

注意原来的TextAsset CARS还是需要在Inspector面板绑定默认的车辆配置文件,作为首次启动的初始数据。

3. 修改SaveToJSON的写入路径

把原来的Application.dataPath换成我们定义的SaveFilePath即可:

public void SaveToJSON()
{
    string jsOutput = JsonUtility.ToJson(myCars);
    File.WriteAllText(SaveFilePath, jsOutput);
    Debug.Log("SaveToJSON() called");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:45:08