存档与读档 (Save & Load)
在任何互动故事中,存档与读档功能都是至关重要的。它允许玩家保存当前的游玩进度,并在之后随时恢复。在 BandTwine 中,存档系统负责将游戏的核心状态持久化。
9.1 存档机制
BandTwine 的存档主要通过游戏界面(侧栏菜单的 存档 选项卡)和 autosave 动作来触发。
9.1.1 存档内容
当游戏保存时,以下核心数据会被打包成一个 JSON 对象并存储:
- 变量 (
variables): 游戏中的所有变量都会被保存,除了variables.temp下的临时变量。 - 当前节点ID (
currentNodeId): 记录玩家当前所在的节点,以便加载时能回到正确的位置。 - 活跃监听器 (
listeners): 所有当前活跃的、且"once": false的监听器也会被保存,确保它们在加载后能继续工作。
例外:
variables.temp下的临时变量会被自动排除,因为它们不应被持久化,开发者也不应该使用它们存储非临时数据
9.1.2 存档方式
- 自动存档: 在
common/data.json中,您可以通过autosave动作来触发自动存档。这通常用于在关键节点或重要事件发生后,为玩家自动保存进度。autosave会将游戏保存到默认的自动存档位。
这是一个只读的存档位,不能被删除或手动覆盖,每次进入游戏时都会默认加载这个存档位
```json
"actions": [
{ "type": "autosave" },
{ "type": "toast", "message": "游戏已自动保存。" }
]
```
- 手动存档: 在游戏侧栏菜单的 存档 选项卡,玩家可以在其中选择一个存档位(Slot)进行手动保存。
9.2 读档机制
读档功能通常也由游戏的界面(侧栏菜单的 存档 选项卡)提供。当玩家选择一个存档位加载时,引擎会执行以下操作:
- 读取数据: 从存储中读取指定存档位的 JSON 数据。
- 恢复状态:
- 用存档中的
variables对象完全覆盖当前游戏的变量。 - 清空当前的监听器,并重新添加存档中保存的所有监听器。
- 根据存档中的
currentNodeId,加载并跳转到对应的节点。
- 用存档中的
9.3 最佳实践
明确存档时机:
- 在关键剧情点、章节开始、重要决策前后,使用
autosave动作。 - 在游戏界面中为玩家提供清晰的手动存档选项。
- 在关键剧情点、章节开始、重要决策前后,使用
管理存档位:
- 存档位
0通常被用作自动存档。 - 引擎已经为手动存档提供了4个槽位,并显示存档时间,方便玩家管理。
- 你也可以自行修改
engine.ux引擎源码增加存档位
- 存档位
变量的持久化考量:
- 将所有需要长期保存的状态(如玩家属性、任务进度)放在
variables的常规路径下,保证玩家游玩体验。 - 将所有一次性的、无需保存的数据(如页面间传递的临时参数)放在
variables.temp下,防止存档数据冗余。
- 将所有需要长期保存的状态(如玩家属性、任务进度)放在
监听器的持久化考量:
- 只有
"once": false的监听器才会被保存。一次性监听器在触发后就会被移除,不会进入存档。 - 如果一个监听器需要在游戏加载后立即生效,请确保它在存档时是活跃的且
"once": false。
- 只有
版本兼容性:
- 当您更新游戏,并对
variables结构做出重大改变时,旧的存档可能会失效。在发布重大更新时,请向玩家说明这一点。
- 当您更新游戏,并对
通过精心设计的存档与读档机制,您可以确保玩家的游戏体验流畅且无忧。