跳转至

本地存档管理器

GFStorageUtility 是基于 Godot user:// 的本地持久化工具。它负责把字典、槽位元数据和 Resource 文件写入项目可写目录,并在读取时执行 codec 解码、完整性校验、事务恢复和版本迁移。

槽位存储会把核心数据和展示用 Metadata 分开,读档列表 UI 可以只读取 Metadata 与修改时间,不必加载完整存档载荷。

GFStorageCodec 提供 JSON/Binary 编码、可选压缩、SHA-256 完整性校验、轻量 XOR 混淆和框架存储元信息。若业务载荷根字典本身已有 _meta 字段,codec 会把框架元信息写入独立 envelope,读取时仍还原用户自己的 _meta,避免存档格式和业务数据抢同一个键。这里的混淆只用于降低误编辑概率,不能用于保护敏感数据。

同时原生支持 Godot 的 Resource 类型直接存取,例如 .tres.res

GFStorageCodec 的 JSON 格式面向普通 JSON 数据。需要保留 Vector、Color、PackedArray 等 Godot 值类型时,先用 GFVariantJsonCodec 转换;需要保存 Resource 或 Node 引用时,使用 GFVariantReferenceCodec 的显式引用标记,或由 SaveGraph 属性序列化器代为处理。

项目级存档聚合

GFStorageUtility 只负责把项目给出的载荷可靠落盘,不提供全局 SaveSystem、业务模块注册表或固定存档目录规范。项目可以在自己的 System、Installer 或存档服务中收集多个 Model、Domain 容器、运行时快照和项目配置,再把聚合后的字典交给 save_data()save_slot()

这种聚合结构应由项目定义,例如 schema 版本、玩家资料、世界状态、设置、统计和自定义预览字段。GF 侧只承诺通用机制:路径安全、事务恢复、codec、checksum、压缩、槽位 metadata、Resource 存取和 register_migration() 版本迁移。模块优先级、业务字段含义、奖励发放、云同步账号隔离、平台加密和冲突策略都应留在项目层或独立插件。

基础用法

var storage := Gf.get_utility(GFStorageUtility) as GFStorageUtility

# -- 字典与槽位存档 --
# 保存槽位,后一个字典是高层预览专用的 Metadata
storage.save_slot(1, {"player_hp": 100}, {"play_time": "12:00", "level": 5})

# 在读档选单展示
var meta := storage.load_slot_meta(1)
print(meta.get("level"))

# 枚举所有有效槽位,只读取 metadata 和修改时间
for slot_info in storage.list_slots():
    print(slot_info["slot_id"], slot_info["metadata"])

# 正式进入游戏后再读取完整核心数据
var full_data := storage.load_slot(1)

# -- Resource 存档 --
var my_res := Resource.new()
storage.save_resource("my_custom_resource.tres", my_res)

var loaded_res := storage.load_resource("my_custom_resource.tres")

文件管理

除槽位和字典读写外,ensure_directory()list_files()delete_file() 可用于管理同一存储根目录下的通用文件,例如列出本地缩略图、缓存 manifest 或项目自定义资源文件。

它们复用 GFStorageUtility 的路径安全策略:默认拒绝绝对路径并阻止 .. 跨目录;纯字典读写 API 会直接拒绝空 file_name,而不是写入内部兜底文件名。

递归枚举默认限制深度和返回数量,可通过 list_files(..., { "max_scan_depth": 64, "max_file_count": 20000 }) 调整。枚举结果返回存储相对路径,适合交给 load_data()load_resource() 或项目自己的读取流程继续处理。

槽位列表仍应优先使用 list_slots(),避免把内部事务文件、备份文件或项目临时文件混入读档 UI。