Jogos muitas vezes precisam armazenar dados persistentes entre sessões, como o nível de um jogador, pontos de experiência, dinheiro, itens de inventário, localização e muito mais.
Este tutorial mostra como criar um armazenamento básico de dados , salvar dados do jogador e ler os dados de volta para uma sessão de jogo
Habilitar acesso ao Studio
Por padrão, jogos testados no Studio não podem acessar armazenamentos de dados, então você deve habilitá-los primeiro:
Publique a experiência.
Escolha Arquivo e Configurações de Jogo .
Na seção Segurança , ative Habilitar Acesso do Studio aos Serviços de API e clique em Salvar .
Criar uma loja de dados
Armazenamentos de dados requerem um nome único nome .Este exemplo cria um armazenamento de dados chamado JogadorDourado que salva o ouro de cada jogador em armazenamento persistente:
Crie um Script dentro de ServerScriptService chamado GoldManager .
Armazenamentos de dados são gerenciados por DataStoreService, portanto, obtenha o serviço:
local DataStoreService = game:GetService("DataStoreService")Chame DataStoreService:GetDataStore() com a string "PlayerGold".Este método acessa o armazenamento de dados do Jogador Dourado se ele já existirSe não existe, o método cria um novo armazenamento de dados e o nomeia PlayerGold .
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")
Salve dados
Um armazenamento de dados é essencialmente um dicionário, como uma tabela Luau.Cada valor no armazenamento de dados é indexado por uma chave única , que pode ser a única do jogador ou simplesmente uma corda nomeada para uma promoção de jogo.
Key | Value |
---|---|
31250608 | 50 |
351675979 | 20 |
505306092 | 78000 |
Para salvar dados do jogador na loja de dados:
Crie uma variável chamada playerUserID para a chave do armazenamento de dados. Então, use playerGold para armazenar a quantidade inicial de ouro de um jogador
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- Chave e valor do armazenamento de dadoslocal playerUserID = 505306092local playerGold = 250Para salvar dados no armazenamento de dados PlayerGold, chame SetAsync dentro de uma chamada protegida, passando as variáveis de chave e valor previamente criadas.
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- Chave e valor do armazenamento de dadoslocal playerUserID = 505306092local playerGold = 250-- Defina a chave do armazenamento de dadoslocal success, error = pcall(function()goldStore:SetAsync(playerUserID, playerGold)end)if not success thenwarn(error)end
Funções como SetAsync() são chamadas de rede que podem ocasionalmente falhar.Como mostrado acima, pcall() é usado para detectar e lidar com quando tais falhas ocorrem.
Em sua forma mais básica, pcall() aceita uma função e retorna dois valores:
- O status, que é true se a função for executada sem erros, ou false caso contrário.
- O valor de retorno da função ou uma mensagem de erro.
A amostra acima verifica o status na linha 13. Se SetAsync() falhar por qualquer motivo, a amostra exibe o erro na janela Saída.
Leia dados
Para ler dados de um armazenamento de dados, chame GetAsync() com o nome de chave desejado.
local DataStoreService = game:GetService("DataStoreService")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Chave e valor do armazenamento de dados
local playerUserID = 505306092
local playerGold = 250
-- Defina a chave do armazenamento de dados
local setSuccess, errorMessage = pcall(function()
goldStore:SetAsync(playerUserID, playerGold)
end)
if not setSuccess then
warn(errorMessage)
end
-- Leia a chave do armazenamento de dados
local getSuccess, currentGold = pcall(function()
return goldStore:GetAsync(playerUserID)
end)
if getSuccess then
print(currentGold)
end
Para testar o script, clique em Executar e perceba o valor impresso na janela Saída .Observe que pode demorar alguns segundos, pois as funções devem se conectar aos servidores de armazenamento de dados.
Leia e salve automaticamente
O script anterior funciona, mas tem um problema fundamental: inclui valores codificados em hard para playerUserID e playerGold, portanto, não suporta vários jogadores com diferentes quantidades de ouro.Uma solução mais realista lê o valor do ouro quando o jogador se conecta à experiência e então o salva quando o jogador sai.Essa abordagem significa conectar as chamadas do armazenamento de dados a eventos do serviço .
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Adicione valores de ouro para cada jogador em uma tabela local para evitar atingir os dados
-- armazenar repetidamente.
local playerGold = {}
local function incrementGold(player, amount)
playerGold[player.UserId] += amount
end
local function onPlayerAdded(player)
-- Leia a chave do armazenamento de dados
local success, storedGold = pcall(function()
return goldStore:GetAsync(player.UserId)
end)
if success then
local currentGold
if storedGold then
currentGold = storedGold
else
currentGold = 0
end
playerGold[player.UserId] = currentGold
print(currentGold)
end
-- Testar incrementando ouro
incrementGold(player, 5)
end
local function onPlayerRemoving(player)
-- Defina a chave do armazenamento de dados
local success, err = pcall(function()
goldStore:SetAsync(player.UserId, playerGold[player.UserId])
end)
if not success then
warn(err)
end
-- Limpe a entrada para que a tabela não cresça ao longo da vida útil do servidor
playerGold[player.UserId] = nil
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)
Leia e salve a posição do personagem
Para salvar a posição do jogador, você trabalha com o Character em vez do Player, mas o princípio é semelhante.Desta vez, crie um Script dentro de ServerScriptService chamado Gerenciador de Posição :
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local Workspace = game:GetService("Workspace")
local playerPositionStore = DataStoreService:GetDataStore("PlayerPositionStore")
local function positionHandler(player)
-- Carregar posição ao adicionar personagem
player.CharacterAdded:Connect(function(character)
local success, coords = pcall(function()
return playerPositionStore:GetAsync(player.UserId)
end)
local position = Vector3.new(coords[1], coords[2], coords[3])
if success and position then
character:PivotTo(CFrame.new(position))
print("Loaded player position!")
else
warn("Failed to load position for player " .. player.Name .. ". Placing in default position.")
end
-- Lidar com a ressurgência do jogador após morte
local humanoid = character:FindFirstChildOfClass("Humanoid")
humanoid.Died:Connect(function()
local spawnLocation = Workspace:FindFirstChild("SpawnLocation")
character:PivotTo(spawnLocation.CFrame)
end)
end)
-- Salvar posição ao remover personagem
player.CharacterRemoving:Connect(function(character)
local position = character:GetPivot().Position
local success, err = pcall(function()
playerPositionStore:SetAsync(player.UserId, {position.X, position.Y, position.Z})
print("Saved player position!")
end)
if not success then
warn("Failed to save position for player " .. player.Name .. ": " .. err)
end
end)
end
Players.PlayerAdded:Connect(positionHandler)
Este script adiciona um novo armazenamento de dados, playerPositionStore .Como os armazenamentos de dados só armazenam tipos básicos ao invés de objetos, você tem que armazenar as coordenadas X, Y e Z como números individuais ao invés de um único Vector3 ou CFrame valor.Ao testar sua experiência, mova seu personagem ao redor.Observe como seu personagem retorna à mesma posição na próxima vez que testar sua experiência.
Exemplo de projeto
Agora que você entende o uso básico do armazenamento de dados, teste-o no jogo de amostra Corrida do Ouro.Você também pode editar o jogo no Studio e explorar o script aprimorado do Gerenciador de Ouro , que exibe ouro como parte da interface do usuário e inclui salvamento automático.