学习空间/存档基础:先把一个事实安全地读回来
状态与流程 / LESSON 19

存档基础:先把一个事实安全地读回来

学习 user://、错误处理与格式校验,不提前实现整套存档。

进阶约 9 分钟阅读,实作另计4 节按需学
CONCEPT MAP先看一眼知识之间的联系
先看一眼知识之间的联系01提取事实02写入文件03解析校验04恢复状态
顺着图中的联系理解本课,再用下面的练习验证。图解是教学模型,不是引擎运行结果。

01存档最小需要什么

存档把运行时事实写到持久位置,并在下次启动恢复。至少要考虑:文件不存在、无法打开、内容损坏、字段类型不对、格式版本不支持。不要把整个节点树或任意 Object 直接序列化成“以后应该能还原”的黑盒。正式数据结构尚未确认,本课只保存一个教学布尔值。

02完整单字段练习脚本

save_practice.gd gdscript
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 OK

03分开验证写与读

  1. 挂在独立 Node 场景。用临时 _ready 函数设置 has_examined = true,再打印 save_practice() 的返回码。注意:会创建或覆盖练习应用 user:// 下同名文件。
  2. 第二次运行删除刚才的写入调用,只调用 load_practice(),再打印变量。应读到 true。
  3. 在 Godot 的用户数据目录入口中定位这份练习文件,先保留副本再故意写入错误格式,验证加载返回错误且不会修改现有状态。
  4. 测试缺文件和 schema_version 不支持,确保 UI 能明确提示“无存档”或“加载失败”,不要都当作成功。

04为什么还不是生产级存档

这是读写与校验教学,不是崩溃安全提交:WRITE 会覆盖现有文件,写入途中断电可能损坏。本课未做临时文件替换、备份轮换、版本迁移、场景状态恢复和并发写入管理。正式设计再加入这些,并验证原始可恢复存档不会被失败操作破坏。JSON 数字解析的类型也需检查,不要不经校验就强制转成想要的类型。

动手后,再勾选

不是“我看懂了”,而是你在独立练习里做出并检查过。

CHECK YOUR UNDERSTANDING

换一个情景,你会怎么判断?

JSON 解析成功,是否就能认定存档有效?

用自己的话,留一条笔记

可以写“我之前以为……,现在发现……”,或者记录还没解决的问题。

仅保存在此浏览器0 / 20000

回到资料核对

本课是解释与练习,不替代对应版本的官方手册。网页实验不运行 Godot;未标明实机验证的代码,仍需在独立工程中检查。

把这课收进你的理解里。

标记已读不会自动勾选实作,也不代表游戏功能已经完成。

输入一个你想弄明白的问题。

按 Esc 关闭 · 标题、关键词和正文一起搜索