排行榜投喂扮演口腔等都要即时本地化持久化

7 小时前2 浏览综合
让我分析问题:
当前问题:
扮演(Register/Unregister) — 乐观更新了 organRoles_ 但仅存在于内存,页面重开就丢失。且非多人模式下 IsMultiplayer()=false 时直接 return,完全无效
投喂(Feed/FoodAlert) — foodAlerts_ 仅内存计数,SendFoodGift 在非多人模式下直接 return,单机投喂无法触发 alert
器官标签(折叠行) — 依赖 organRoles_ 数据,同样非多人模式下为空
折叠行"投喂"按钮 — 非多人模式下投喂走本地 FoodPipeline.PushToOrgan,但不触发 OnFoodGift 回调更新 alert
核心方案:所有操作统一走 本地持久化(File 沙箱存储),同时在多人模式下叠加网络同步。
注意到 WASM 平台上本地文件在页面刷新后丢失。但看到代码中已有 leaderboard.json 本地文件存储模式在使用(LoadLocalLeaderboard / SaveLocalLeaderboard),说明用户接受这个方案。我需要用同样的模式对 organRoles 和 foodAlerts 做本地持久化。
改动内容
新增本地持久化文件(沙箱内自动隔离):
organ_roles.json — 器官扮演角色注册表
food_alerts.json — 投喂食物提醒计数
即时本地化 + 持久化的操作:
操作 之前 现在
扮演(注册) 仅内存乐观更新 + 网络发送 内存更新 → SaveLocalRoles() → 网络发送
取消(注销) 仅内存清除 + 网络发送 内存清除 → SaveLocalRoles() → 网络发送
投喂(单机) 只写 FoodPipeline,不更新 alert 写 FoodPipeline → UpdateFoodAlert() → SaveLocalAlerts() → 刷新 UI
投喂(多人) 只发网络,不更新本地 alert 发网络 → UpdateFoodAlert() → SaveLocalAlerts() → 刷新 UI
收到投喂通知 仅内存计数 内存计数 → SaveLocalAlerts()
器官标签(折叠行) 依赖 organRoles_ 内存数据 初始化时 LoadLocalRoles() 恢复 → 标签立即可见
数据恢复策略:
Leaderboard.Create() 时从本地文件恢复 organRoles_ 和 foodAlerts_
服务端拉取成功后覆盖本地数据并重新持久化
服务端拉取失败时保留本地已恢复的数据(不清空)
TapTap
1