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

Unity + Ink/Inkle 已保存故事状态JSON加载失败及存档优化问询

问题根因定位
  • 重复初始化冗余:你在Start方法开头已经执行了dialogue = new Story(dialogueJSON.text);,在存档加载的if分支里又重复初始化了一次Story对象,虽然不属于致命错误,但属于冗余逻辑,建议删除分支内的重复初始化代码。
  • 加载后逻辑错误:Ink的State调用LoadJson()之后,故事指针会直接停在你存档时的当前节点位置,你此时调用包含story.Continue()的loadLine()方法,会直接跳到存档节点的下一行内容,而非加载存档时正在显示的当前行,视觉上就会出现「加载失败、进度跳错」的问题。
  • 自定义状态未同步存储:你当前只存储了Ink引擎本身的故事状态,但是游戏内的自定义状态(包括当前激活的背景、历史对话记录、counter变量数值等)都没有同步存储,加载后这些状态仍为初始值,也会导致加载效果不符合预期。
  • 存档未即时写入:原保存逻辑没有主动调用PlayerPrefs.Save(),PlayerPrefs默认会在应用退出时才将数据写入存储,如果存完后游戏意外崩溃,会导致存档丢失。
修复方案

首先优化保存逻辑,补充自定义状态存储和主动写入:

public void saveGame()
{
    DialogueSystem dialogueSystem = GetComponent<DialogueSystem>();
    dialogueSystem.savedJson = dialogueSystem.dialogue.state.ToJson();
    PlayerPrefs.SetString("saveState", dialogueSystem.savedJson);
    // 补充存储所有需要恢复的自定义状态
    PlayerPrefs.SetInt("activeBGIndex", 当前激活背景在BGs数组中的索引);
    PlayerPrefs.SetString("historyData", 历史对话记录序列化后的字符串);
    PlayerPrefs.SetInt("counterValue", counterScript.currentCount);
    PlayerPrefs.Save(); // 主动触发写入,避免数据丢失
    Debug.Log(dialogueSystem.savedJson);
}

再修改加载逻辑:

private void Start()
{
    dialogue = new Story(dialogueJSON.text);
    currentActiveBG = BGs[0]; 
    historyScript = GetComponent<History>();
    counterScript = GetComponent<counter>();
    
    if (PlayerPrefs.HasKey("saveState")) {
        savedJson = PlayerPrefs.GetString("saveState");
        dialogue.state.LoadJson(savedJson);
        // 直接渲染当前节点文本,不要调用带Continue的loadLine方法
        当前显示对话的UI组件.text = dialogue.currentText;
        // 恢复所有自定义状态
        currentActiveBG = BGs[PlayerPrefs.GetInt("activeBGIndex")];
        historyScript.LoadHistory(PlayerPrefs.GetString("historyData"));
        counterScript.SetCount(PlayerPrefs.GetInt("counterValue"));
        Debug.Log(savedJson);
    }
    else {
        loadGame("Pre_Prep1");
    }
}
更优的存档实现方案
  • 替换PlayerPrefs存储方案:PlayerPrefs对长字符串的存储有长度限制,且存储位置依赖系统注册表/配置文件,容易丢失。建议直接将序列化后的存档数据写入Application.persistentDataPath路径下的独立.json文件,支持更大的存储容量,也方便玩家备份、转移存档。
  • 统一封装存档结构:将Ink状态、所有自定义游戏状态、存档版本号、存档时间戳等信息封装为一个可序列化的类,统一序列化后存储,避免多数据分散存储导致的不一致问题。
  • 增加存档校验:可以给存档文件增加简单的校验字段,避免玩家恶意篡改存档数据导致游戏运行异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:18:04