跳转到内容

如何使用云存档功能

如何使用云存档功能

  • 解答:

目前云存档相关功能只能写在服务端,而按钮相关逻辑则只能写在客户端,如果想要实现玩家按下按钮后云存档的功能,我们需要用发送通知的方法来实现。

云存档示例代码:

新建一个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)
end
end
--@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)
end
return Demo