Skip to content

存档与读档 (Save & Load)

在任何互动故事中,存档与读档功能都是至关重要的。它允许玩家保存当前的游玩进度,并在之后随时恢复。在 BandTwine 中,存档系统负责将游戏的核心状态持久化。

9.1 存档机制

BandTwine 的存档主要通过游戏界面(侧栏菜单的 存档 选项卡)和 autosave 动作来触发。

9.1.1 存档内容

当游戏保存时,以下核心数据会被打包成一个 JSON 对象并存储:

  1. 变量 (variables): 游戏中的所有变量都会被保存,除了 variables.temp 下的临时变量。
  2. 当前节点ID (currentNodeId): 记录玩家当前所在的节点,以便加载时能回到正确的位置。
  3. 活跃监听器 (listeners): 所有当前活跃的、且 "once": false 的监听器也会被保存,确保它们在加载后能继续工作。

例外:variables.temp 下的临时变量会被自动排除,因为它们不应被持久化,开发者也不应该使用它们存储非临时数据

9.1.2 存档方式

  • 自动存档: 在 common/data.json 中,您可以通过 autosave 动作来触发自动存档。这通常用于在关键节点或重要事件发生后,为玩家自动保存进度。autosave 会将游戏保存到默认的自动存档位。

这是一个只读的存档位,不能被删除或手动覆盖,每次进入游戏时都会默认加载这个存档位

```json
"actions": [
  { "type": "autosave" },
  { "type": "toast", "message": "游戏已自动保存。" }
]
```
  • 手动存档: 在游戏侧栏菜单的 存档 选项卡,玩家可以在其中选择一个存档位(Slot)进行手动保存。

9.2 读档机制

读档功能通常也由游戏的界面(侧栏菜单的 存档 选项卡)提供。当玩家选择一个存档位加载时,引擎会执行以下操作:

  1. 读取数据: 从存储中读取指定存档位的 JSON 数据。
  2. 恢复状态:
    • 用存档中的 variables 对象完全覆盖当前游戏的变量。
    • 清空当前的监听器,并重新添加存档中保存的所有监听器。
    • 根据存档中的 currentNodeId,加载并跳转到对应的节点。

9.3 最佳实践

  • 明确存档时机:

    • 在关键剧情点、章节开始、重要决策前后,使用 autosave 动作。
    • 在游戏界面中为玩家提供清晰的手动存档选项。
  • 管理存档位:

    • 存档位 0 通常被用作自动存档。
    • 引擎已经为手动存档提供了4个槽位,并显示存档时间,方便玩家管理。
    • 你也可以自行修改 engine.ux 引擎源码增加存档位
  • 变量的持久化考量:

    • 将所有需要长期保存的状态(如玩家属性、任务进度)放在 variables 的常规路径下,保证玩家游玩体验。
    • 将所有一次性的、无需保存的数据(如页面间传递的临时参数)放在 variables.temp 下,防止存档数据冗余。
  • 监听器的持久化考量:

    • 只有 "once": false 的监听器才会被保存。一次性监听器在触发后就会被移除,不会进入存档。
    • 如果一个监听器需要在游戏加载后立即生效,请确保它在存档时是活跃的且 "once": false
  • 版本兼容性:

    • 当您更新游戏,并对 variables 结构做出重大改变时,旧的存档可能会失效。在发布重大更新时,请向玩家说明这一点。

通过精心设计的存档与读档机制,您可以确保玩家的游戏体验流畅且无忧。