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

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++;
    }
}

问题原因

  1. 保存时未同步最新值:SaveData的Start方法仅在初始化时将UI.count赋值给data.countSave,后续点击按钮修改UI.count后,data.countSave并未同步更新,导致保存的始终是初始值。
  2. 加载后未同步回UI:加载存档后,仅更新了data.countSave,但没有将值同步到UI.count,导致UI显示的数值不会随存档变化。
  3. 初始化逻辑错误:启动时直接覆盖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:25:20