如何使用云存档功能
如何使用云存档功能
- 解答:
目前云存档相关功能只能写在服务端,而按钮相关逻辑则只能写在客户端,如果想要实现玩家按下按钮后云存档的功能,我们需要用发送通知的方法来实现。
云存档示例代码:
新建一个Lua文件,这里我命名为Demo.lua
--@class Demo;与文件名保持一致local Demo = {}
-- 通知,号码需不重复Demo.Notify = { ClientReceivesData = 10001, UpdatePlayerData = 10002,}------------------------------------------------------------------- 参数 -------------------------------------------------------------------local players_data = {} -- 玩家数据组,在服务端调用local player_data = {} -- 玩家个人数据,在客户端调用local Btn = 100046 -- 按钮实例ID
------------------------------------------------------------------- 自定义函数 ------------------------------------------------------------------
-- @Notify-- @description 初始化玩家数据-- @range 服务端function Demo:InitPlayerData(playerId) --创建玩家第一次游玩时的初始数据 local player_init_data = {Score = 0}
--判断玩家是否有云存档 if Archive:HasPlayerData(playerId,Archive.TYPE.String,"数据") == true then --如果有就读取玩家数据并赋值 --将json格式的字符串还原成table,存储采用json格式的字符串可以一个云存档存储多个数据,方便调用与管理。 players_data[playerId] = MiscService:JsonStr2Table(Archive:GetPlayerData(playerId,Archive.TYPE.String,"数据")) else --如果第一次没有数据,那么就初始化云存档 players_data[playerId] = player_init_data --云存储,将table解析成json格式的字符串 Archive:SetPlayerData(playerId,Archive.TYPE.String,"数据",MiscService:Table2JsonStr(players_data[playerId])) end players_data[playerId] = player_init_data --存入全部玩家的信息表 --发送玩家数据到客户端 local msg = {player_data = players_data[playerId],} System:SendToClient(playerId, self.Notify.ClientReceivesData, msg)end------------------------------------------------------------------- 通知 -------------------------------------------------------------------
-- @Notify-- @description 客户端接收服务器的玩家数据-- @range 客户端function Demo:ClientReceivesData(msgId, msg) player_data = msg.player_data --设置按钮的文本为玩家分数数据 UI:SetText({Btn},tostring(player_data.Score))end
-- @Notify-- @description 更新玩家数据-- @range 服务端function Demo:UpdatePlayerData(msgId, msg) local playerId = msg.playerId -- 通知发送来的玩家ID local playerdata = msg.playerdata -- 通知发送来的玩家数据 players_data[playerId] = playerdata -- 存入全部玩家的信息表 --云存储,将table解析成json格式的字符串 Archive:SetPlayerData(playerId,Archive.TYPE.String,"数据",MiscService:Table2JsonStr(players_data[playerId])) --发送玩家数据到客户端 local msg2 = {player_data = players_data[playerId],} System:SendToClient(playerId, self.Notify.ClientReceivesData, msg2)end
-------------------------------------------------------------------- 事件触发 ------------------------------------------------------------------
--@description 游戏初始化时服务端的操作,也可以写单机模式下和服务端下共通的操作function Demo:ServerInit() --注册通知 System:BindNotify(self.Notify.UpdatePlayerData, self.UpdatePlayerData, self)end
--@description 游戏开始时服务端的操作function Demo:OnServerStart() --初始化全部玩家数据 local playerIds = Character:GetAllPlayerIds() for _, playerId in ipairs(playerIds) do --调用初始化玩家数据函数 self:InitPlayerData(playerId) endend
--@description 游戏初始化时客户端的操作function Demo:ClientInit() --注册通知 System:BindNotify(self.Notify.ClientReceivesData, self.ClientReceivesData, self)end--点击按钮UI:RegisterClicked(Btn,function() local localPlayerId = Character:GetLocalPlayerId() player_data.Score = player_data.Score + 1 -- 增加玩家分数 -- 发送刷新玩家数据通知到服务端 local msg = {playerId = localPlayerId,playerdata = player_data} System:SendToServer(self.Notify.UpdatePlayerData, msg)end)endreturn Demo