Nesse post vamos dar um exemplo de persistência de dados no Roblox Studio.
A persistência de dados diz respeito a capacidade de um sistema armazenar os dados que são usados pelo mesmo. Como exemplo, usaremos o Checkpoint. Até o momento fizemos um checkpoint que armazena nosso estágio enquanto estamos no jogo. Mas depois que saímos essa informação se perde e quando retornamos sempre começamos do início. Conforme o jogo cresce fica inviável mantermos dessa forma.
Sendo assim, precisamos de alguma forma armazenar a informação de que um determinado player está em algum estágio do jogo e quando ele sair essa informação vai ficar armazenada em algum servidor para que quando ele retornar em uma próxima vez seja possível continuar de onde parou.
No Roblox Studio a persistência de dados é feita através do serviço DataStoreService. É importante lembrar que para usar esse serviço de forma local, é necessário habilitar o Studio Access. Vá em File/Game Settings/Security e ative a opção: Enable Studio Access to API Services.
No Roblox Studio os dados são salvos no formato Chave/Valor. Então, nesse exemplo definimos o playerID como uma chave e o seu checkpoint atual como o valor.
O Roblox Studio usa a função SetAsync() para armazenar dados e GetAsync() para ler os dados que já foram guardados no servidor. Dessa forma, o script abaixo é capaz de salvar o checkpoint dos players para que eles possam recomeçar o jogo do local onde pararam.
local DataStoreService = game:GetService("DataStoreService")
local checkpointStore = DataStoreService:GetDataStore("PlayerCheckpoint")
local Players = game:GetService("Players")
local playerUserID = nil
--guardar os checkpoints dos usuários
local playerCheckpoint = {}
local AUTOSAVE_INTERVAL = 120
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local checkpoints = game.Workspace.Checkpoints
local function saveData(dataStoreKey, value)
local setSuccess, errorMessage = pcall(function()
checkpointStore:SetAsync(dataStoreKey, value)
end)
if not setSuccess then
warn(errorMessage)
end
end
local function onPlayerRemoving(player)
local playerUserID = player.UserId
playerCheckpoint[playerUserID] = player.Team.Name
if playerCheckpoint[playerUserID] then
saveData(playerUserID, playerCheckpoint[playerUserID])
end
end
local function onPlayerAdded(player)
local playerUserID = player.UserId
local success, storedCheckpoint = pcall(function()
return checkpointStore:GetAsync(playerUserID)
end)
if success then
local currentCheckpoint = storedCheckpoint or "Stage1"
playerCheckpoint[playerUserID] = currentCheckpoint
player.Team = game.Teams[currentCheckpoint]
end
coroutine.wrap(function()
while wait(AUTOSAVE_INTERVAL) do
playerCheckpoint[playerUserID] = player.Team.Name
if playerCheckpoint[playerUserID] then
saveData(playerUserID, playerCheckpoint[playerUserID])
end
end
end)()
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)
PlayerAdded verifica se o player entrou no jogo e assim podemos atualizar o checkpoint do jogador. PlayerRemoving verifica se o jogador saiu do jogo e então temos que salvar o último checkpoint dele.
Você pode ver esse script funcionando em: OBBY RJ BYTE