这是目前自用的一个存读档流程
02/08144 浏览开发心得
比较简单的存读档,可以自己试试能不能用。
一、存储方式
lua
-- 云变量 API(clientScore)
-- 存:BatchSet → Set(key, jsonStr) → Save(callback)
-- 取:BatchGet → Key(key) → Fetch(callback)
-- 数据格式:Lua table → JSON 字符串
二、存档流程
收集游戏状态 → 打包成 table → TableToJSON → 云端保存
规则:
存档结构里加 version 字段,方便后续迁移
table 的 key 如果是数字,存 JSON 前必须 tostring(k) 转成字符串
只存必要数据(坐标、ID、配置索引),不存运行时临时状态
三、读档流程
云端拉取 → JSONToTable → 清空当前状态 → 按顺序恢复 → 刷新模块上下文
规则:
读回来的 key 需要 tonumber(k) or k 转回数字
恢复前先清空再写入,防止旧数据残留:
lua
--先清空
for k in pairs(targetTable) do targetTable[k] = nil end
-- 再写入
for k, v in pairs(savedData) do targetTable[k] = v end
所有字段读取时给默认值,兼容旧版存档:
lua
local gold = saveData.playerGold or 100
local stock = saveData.playerCardStock or {}
四、模块化项目的恢复顺序
1. 清空全局状态(核心数据表)
2. 重新初始化基础系统(网格、场景等)
3. 恢复数值型数据(金币、计数器等)
4. 恢复集合型数据(仓库、库存、解锁状态)
5. 恢复实体(卡牌/角色/建筑等,含位置和属性)
6. 恢复关系(连接、引用、父子关系)
7. 刷新所有模块上下文(所有引用了上述数据的模块)
为什么顺序重要:实体恢复依赖基础系统就绪,关系恢复依赖实体已存在,模块刷新必须在数据全部就位后。
五、核心注意事项
规则 说明
先清后写 恢复集合数据前先清空,否则存档里没有的条目会残留
key 类型转换 JSON 不支持数字 key,存时 tostring,读时 tonumber
默认值兜底 每个字段都要 or 默认值,旧存档可能没有新字段
刷新模块引用 读档后表引用已变,所有依赖模块必须重新绑定上下文
自增 ID 同步 恢复实体时更新 ID 计数器,取所有已恢复 ID 的最大值 +1
不存运行时状态 动画进度、临时 UI 状态、计时器等不需要存档
版本号 存档带版本号,结构变更时可做数据迁移
六、新增功能扩展存档的检查清单
每次新增需要持久化的数据时:
[ ] 存档函数中添加该字段的收集
[ ] 恢复函数中添加该字段的还原(先清空再写入)
[ ] 读取时给默认值,兼容无此字段的旧存档
[ ] 如果引入了新模块,恢复末尾刷新其上下文
[ ] 测试:新存档存读正常、旧存档读取不崩溃


