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
相关产品推荐
相关产品推荐

