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