如何使用云存档功能
如何使用云存档功能
- 解答:
目前云存档相关功能只能写在服务端,而按钮相关逻辑则只能写在客户端,如果想要实现玩家按下按钮后云存档的功能,我们需要用发送通知的方法来实现。
云存档示例代码:
新建一个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