Salve dados

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

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:

  1. Publique a experiência.

  2. Escolha Arquivo e Configurações de Jogo .

  3. 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:

  1. Crie um Script dentro de ServerScriptService chamado GoldManager .

  2. Armazenamentos de dados são gerenciados por DataStoreService, portanto, obtenha o serviço:


    local DataStoreService = game:GetService("DataStoreService")
  3. 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.

KeyValue
3125060850
35167597920
50530609278000

Para salvar dados do jogador na loja de dados:

  1. 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 dados
    local playerUserID = 505306092
    local playerGold = 250
  2. Para 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 dados
    local playerUserID = 505306092
    local playerGold = 250
    -- Defina a chave do armazenamento de dados
    local success, error = pcall(function()
    goldStore:SetAsync(playerUserID, playerGold)
    end)
    if not success then
    warn(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.