存档读档与回滚
本页属于 GenPy Ren'Py 学习路线。教程内容面向 Ren'Py 8.x,并在页面末尾连接到 GenPy 的对应工作流。
学习目标
- 了解“存档读档与回滚”在 Ren'Py 项目中的用途。
- 能在一个最小项目里验证本章相关语法或工作流。
- 知道发布前需要检查的常见风险,并能在 GenPy 中继续维护。
核心语法
saveloadrollbackdefaultconfig.rollback_enabled
可运行示例
text
label after_load:
$ rebuild_runtime_caches()
return教程正文
Ren'Py 自动提供完整的存档/读档和**回滚(rollback)**系统,几乎零配置。理解它的规则, 能避免“读档后状态错乱”这类常见 bug。
1. 自动存档机制
- 引擎会自动序列化所有脚本级变量(
store命名空间里的可变量)。 - 玩家通过游戏菜单的 Save / Load 存读档;还有 autosave(自动存档)和 quicksave/quickload。
- 你通常不需要手写存档逻辑——把状态放进会被存档的变量即可。
2. 哪些变量会被存档?
| 定义方式 | 是否进存档 | 说明 |
|---|---|---|
default x = ... | ✅ 是 | 推荐:可变剧情状态 |
$ x = ...(剧情中赋值) | ✅ 是 | 也会存,但首次初始化时机不如 default 稳 |
define x = ... | ❌ 否 | 加载期常量,不存档 |
persistent.x | ✅ 跨存档 | 全局持久(见第 19 章) |
规则:会变化、需要被存档记住的,用
default定义。define的东西不进存档(也不该变)。
3. 回滚(Rollback)
- 玩家滚动鼠标滚轮向上 /
Page Up可回退到之前的对话,甚至重选分支。 - 回滚会自动还原期间所有存档变量的变化(包括列表/字典的修改)。
- 这意味着:你改的存档变量在回滚时会被“撤销”,无需自己管理历史。
阻止回滚
某些点不希望玩家回退(如开宝箱后不能反悔):
text
$ renpy.block_rollback() # 此处之前不可再回滚4. 不可回滚 / 不应回滚的状态
有些状态不该被回滚撤销(如“已解锁成就”“已看过的 CG”)。这类用:
persistent.*(持久数据,天然不回滚,见第 19 章)。- 或在 Python 对象上用回滚控制。
text
$ persistent.unlocked_gallery_1 = True # 解锁图鉴:回滚也不撤销5. after_load:读档后修复运行期状态
读档只恢复存档变量,不会恢复你在内存里缓存的“非存档运行期状态” (比如某些缓存、注册的回调)。在 after_load 里重建它们:
text
label after_load:
$ rebuild_runtime_caches()
return6. 存档相关 API
text
$ renpy.save("quick") # 程序化存档到某槽
$ renpy.load("quick") # 读档
$ renpy.take_screenshot() # 抓当前画面作存档缩略图
$ renpy.save_name = "第二章 - 抉择" # 给存档命名(显示在存档槽)
$ has = renpy.can_load("quick") # 是否存在该存档7. 存档缩略图与命名
- 缩略图尺寸由
config.thumbnail_width/height决定(见第 17 章)。 save_name变量可设“章节名/进度”,在存档界面显示,方便玩家辨认。
8. 不可序列化对象的坑
存档用 pickle 序列化。若把不可序列化的对象(如文件句柄、某些闭包、外部资源)塞进存档变量, 会导致存档失败或损坏。解决:
- 这类对象不要放进
store/存档变量;放进非存档容器或在after_load重建。 - 自定义类尽量保持可 pickle(只存基本数据)。
常见坑
- 读档后“某些状态丢了” → 那是非存档的运行期缓存,去
after_load重建。 - “回滚后变量值不对” → 检查是不是该用
persistent(不该被回滚的状态)。 - “存档报错/打不开” → 多半是塞了不可序列化对象进存档变量。
- 用
default定义可变量,避免首次初始化与回滚的边界问题。
官方参考
在 GenPy 里怎么做
- 在 GenPy 的代码模式中维护相关 .rpy 文件,先保持语法清晰,再逐步加入本章功能。
- 用故事图谱、变量、校验或演出编辑器把“能运行”提升到“可维护”。
- 导出前结合 Ren'Py Lint 和 GenPy 校验结果,确认脚本、素材和发布路径一致。
推荐继续阅读:
