塔拉拉的云变量使用注意事项
03/2764 浏览开发心得 包含 AI 合成内容
开头依旧求资格~
云变量使用有两个关键注意点。
注意事项 1:多人模式下 clientCloud 不可用多人模式的客户端脚本中 clientCloud 为 nil,所有云变量操作必须通过服务端中转。模式clientCloudserverCloud解决方案单机可用不可用直接使用 clientCloud多人客户端不可用不可用通过远程事件请求服务端代为操作多人服务端不可用可用直接使用 serverCloud数据读取:服务端推送替代客户端拉取❌ 错误(多人模式会失败):
客户端 clientCloud:BatchGet → 读取数据
✅ 正确:
客户端连接 → 服务端 HandleClientReady
→ serverCloud:BatchGet(userId) 读取数据
→ SendRemoteEvent 推送给客户端
→ 客户端 onServerInit() 初始化本地显示
数据写入:远程事件中转替代客户端直写❌ 错误(多人模式会失败):
客户端 clientCloud:BatchSet → 写入数据
✅ 正确:
客户端 SendRemoteEvent(PROGRESSION_SAVE, data)
→ 服务端 HandleProgressionSave
→ serverCloud:Get 读取 → 合并 → serverCloud:Set 写回
排行榜同理排行榜查询也通过服务端中转,已在 Leaderboard 模块实现。
注意事项 2:防作弊 — 敏感数值必须由服务端写入可被玩家利益驱动篡改的数值,必须由服务端写入。写入方式API安全性适用场景服务端写入serverCloud安全,服务端权威经验、积分、货币、排行榜相关数值客户端中转远程事件 → 服务端服务端可校验上限非核心但需持久化的数据当前云变量安全分类服务端直接写入 — 高安全云变量 key存储类型写入方式说明prog_total_play_timeiscoresserverCloud:Add(uid, key, 60)总游玩秒数,每 60 秒原子累加prog_daily_data.play_expvalues (JSON 字段)serverCloud:Set(uid, key, daily)每日游玩经验,服务端读取→递增→写回实现位置: Server.lua → HandleUpdate 中的 _progTrackers 逻辑客户端中转服务端写入 — 中安全云变量 key存储类型写入方式说明prog_daily_data.pass_expvalues (JSON 字段)远程事件 → HandleProgressionSave每日通行证经验prog_daily_data.endless_scorevalues (JSON 字段)同上每日无尽积分prog_daily_data.masteryvalues (JSON 字段)同上每日熟练度实现位置: data.lua → saveToCloud() 发送远程事件,Server.lua → HandleProgressionSave 处理注意: 上述三项虽走服务端,但数值由客户端提交,服务端仅做上限校验(PROG_DAILY_CAP)。如果未来涉及奖励兑换,应改为服务端直接计算。
数据流架构┌─────────────────┐ ┌─────────────────┐
│ Server.lua │ │ Client.lua │
│ │ PROGRESSION_SYNC(IsInit) │ │
│ 连接时: │ ────────────────────────────▶ │ 转发给: │
│ BatchGet(uid) │ 全量: TotalPlayTime + │ Standalone │
│ → 推送初始数据 │ 所有每日任务进度 │ .OnProgInit() │
│ │ │ │
│ 每60秒: │ PROGRESSION_SYNC(增量) │ │
│ serverCloud │ ────────────────────────────▶ │ .OnProgSync() │
│ :Add(+60s) │ PlayTimeDelta / DailyPlayExp │ │
│ :Get→+1exp │ │ │
│ :Set(daily) │ PROGRESSION_SAVE │ 通关/失败时: │
│ │ ◀──────────────────────────── │ saveToCloud() │
│ HandleProgSave │ PassExp/EndlessScore/Mastery │ → 远程事件 │
│ :Get→合并→:Set │ │ │
└─────────────────┘ └─────────────────┘
新增云变量时的检查清单添加新的云变量前,回答以下问题:
- [ ] 多人模式下谁来读写?→ clientCloud 不可用,必须走服务端
- [ ] 该数值是否影响玩家收益(经验、货币、排名)?→ 服务端直接写入
- [ ] 该数值是否可以被客户端伪造来获得不当利益?→ 服务端直接写入
- [ ] 该数值是否仅影响 UI 展示、无利益关联?→ 可由客户端中转服务端写入
- [ ] 是否有每日上限?→ 服务端校验上限,不要只依赖客户端检查
- [ ] 读取时机?→ 在 HandleClientReady 中 BatchGet 并推送给客户端
相关文件文件职责scripts/network/Server.lua服务端追踪逻辑、初始数据推送、保存处理scripts/network/Client.lua订阅 PROGRESSION_SYNC 事件,区分初始/增量scripts/network/Shared.lua事件名定义(PROGRESSION_SYNC、PROGRESSION_SAVE)scripts/network/Standalone.luaOnProgressionInit / OnProgressionSync 转发scripts/progression/data.luaonServerInit() 全量初始化、onServerSync() 增量更新、saveToCloud() 远程事件中转scripts/progression/init.luaupdate(dt) 仅本地显示平滑,不写云端

