Unity中JSON文件保存异常:键值无法更新问题求助
Unity JSON保存功能异常:键值始终不变的修复方案
在Unity项目中实现的JSON文件保存功能无法正常工作,JSON文件存在且仅有一行内容,但其中的键值始终不会变化。参考了同类代码写法,但找不到修复方向。
数据保存代码
using UnityEngine; using System.IO; using System; [Serializable] public class Data { public int countSave; } public class SaveData : MonoBehaviour { private string path; Data data; private void Start() { data = new Data(); data.countSave = UI.count; path = Application.persistentDataPath + "/save_data.json"; } private void Update() { if (Input.GetKeyDown(KeyCode.Q)) Save(); if (Input.GetKeyDown(KeyCode.E)) Load(); } public void Save() { string jsonSave = JsonUtility.ToJson(data); File.WriteAllText(path, jsonSave); Debug.Log("Save file created at: " + path); } public void Load() { if(File.Exists(path)) { string jsonLoad = File.ReadAllText(path); data = JsonUtility.FromJson<Data>(jsonLoad); Debug.Log("Load data complete: current count = " + data.countSave); } else Debug.Log("There is no save files to load!"); } }
更新count值的代码
using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; using TMPro; public class UI : MonoBehaviour { [SerializeField] private TextMeshProUGUI text = new TextMeshProUGUI(); public static int count; private void Update() { text.text = count.ToString(); } public void CountButton() { count++; } }
问题原因
- 保存时未同步最新值:
SaveData的Start方法仅在初始化时将UI.count赋值给data.countSave,后续点击按钮修改UI.count后,data.countSave并未同步更新,导致保存的始终是初始值。 - 加载后未同步回UI:加载存档后,仅更新了
data.countSave,但没有将值同步到UI.count,导致UI显示的数值不会随存档变化。 - 初始化逻辑错误:启动时直接覆盖
data的初始值,没有先尝试加载已有存档,会导致原有存档在启动时被覆盖。
修复方案
修改后的SaveData类代码
using UnityEngine; using System.IO; using System; [Serializable] public class Data { public int countSave; } public class SaveData : MonoBehaviour { private string path; Data data; private void Start() { path = Application.persistentDataPath + "/save_data.json"; // 启动时优先加载已有存档,避免覆盖 Load(); // 如果没有存档,初始化data并同步当前UI.count if (data == null) { data = new Data(); data.countSave = UI.count; } else { // 加载后同步到UI UI.count = data.countSave; } } private void Update() { if (Input.GetKeyDown(KeyCode.Q)) Save(); if (Input.GetKeyDown(KeyCode.E)) Load(); } public void Save() { // 保存前先同步UI的最新count值 data.countSave = UI.count; string jsonSave = JsonUtility.ToJson(data); File.WriteAllText(path, jsonSave); Debug.Log("Save file created at: " + path); } public void Load() { if(File.Exists(path)) { string jsonLoad = File.ReadAllText(path); data = JsonUtility.FromJson<Data>(jsonLoad); // 加载后将存档值同步到UI.count UI.count = data.countSave; Debug.Log("Load data complete: current count = " + data.countSave); } else { Debug.Log("There is no save files to load!"); data = null; } } }
关键修改点
- 启动逻辑调整:启动时先尝试加载存档,存在则同步到UI,不存在再初始化数据。
- 保存前同步:每次调用
Save()时,先将UI.count的最新值赋值给data.countSave,确保保存的是当前最新数据。 - 加载后同步:加载存档后,立即将
data.countSave赋值给UI.count,让UI显示存档中的数值。
内容的提问来源于stack exchange,提问作者Emil Grigoryan
相关产品推荐
相关产品推荐

