状态与流程 / LESSON 19
存档基础:先把一个事实安全地读回来
学习 user://、错误处理与格式校验,不提前实现整套存档。
CONCEPT MAP先看一眼知识之间的联系
01存档最小需要什么
存档把运行时事实写到持久位置,并在下次启动恢复。至少要考虑:文件不存在、无法打开、内容损坏、字段类型不对、格式版本不支持。不要把整个节点树或任意 Object 直接序列化成“以后应该能还原”的黑盒。正式数据结构尚未确认,本课只保存一个教学布尔值。
02完整单字段练习脚本
extends Node
const PATH: String = "user://learning_flag.json"
var has_examined: bool = false
func save_practice() -> Error:
var file: FileAccess = FileAccess.open(PATH, FileAccess.WRITE)
if file == null:
return FileAccess.get_open_error()
var payload: Dictionary[String, Variant] = {
"schema_version": 1,
"has_examined": has_examined
}
file.store_string(JSON.stringify(payload))
file.flush()
var error: Error = file.get_error()
file.close()
return error
func load_practice() -> Error:
if not FileAccess.file_exists(PATH):
return ERR_FILE_NOT_FOUND
var file: FileAccess = FileAccess.open(PATH, FileAccess.READ)
if file == null:
return FileAccess.get_open_error()
if file.get_length() > 65536:
file.close()
return ERR_INVALID_DATA
var text: String = file.get_as_text()
file.close()
var parser: JSON = JSON.new()
var error: Error = parser.parse(text)
if error != OK:
return error
var value: Variant = parser.data
if not value is Dictionary:
return ERR_INVALID_DATA
var data: Dictionary = value
var version: Variant = data.get("schema_version")
if not (version is int or version is float):
return ERR_INVALID_DATA
if float(version) != 1.0:
return ERR_INVALID_DATA
var flag: Variant = data.get("has_examined")
if not flag is bool:
return ERR_INVALID_DATA
has_examined = bool(flag)
return OK03分开验证写与读
- 挂在独立 Node 场景。用临时 _ready 函数设置 has_examined = true,再打印 save_practice() 的返回码。注意:会创建或覆盖练习应用 user:// 下同名文件。
- 第二次运行删除刚才的写入调用,只调用 load_practice(),再打印变量。应读到 true。
- 在 Godot 的用户数据目录入口中定位这份练习文件,先保留副本再故意写入错误格式,验证加载返回错误且不会修改现有状态。
- 测试缺文件和 schema_version 不支持,确保 UI 能明确提示“无存档”或“加载失败”,不要都当作成功。
04为什么还不是生产级存档
这是读写与校验教学,不是崩溃安全提交:WRITE 会覆盖现有文件,写入途中断电可能损坏。本课未做临时文件替换、备份轮换、版本迁移、场景状态恢复和并发写入管理。正式设计再加入这些,并验证原始可恢复存档不会被失败操作破坏。JSON 数字解析的类型也需检查,不要不经校验就强制转成想要的类型。
动手后,再勾选
不是“我看懂了”,而是你在独立练习里做出并检查过。
CHECK YOUR UNDERSTANDING
换一个情景,你会怎么判断?
JSON 解析成功,是否就能认定存档有效?
语法正确不代表数据满足应用规则,字段与版本必须明确校验。
用自己的话,留一条笔记
可以写“我之前以为……,现在发现……”,或者记录还没解决的问题。
仅保存在此浏览器0 / 20000
↗回到资料核对
本课是解释与练习,不替代对应版本的官方手册。网页实验不运行 Godot;未标明实机验证的代码,仍需在独立工程中检查。
把这课收进你的理解里。
标记已读不会自动勾选实作,也不代表游戏功能已经完成。