Gravar e exibir dados do jogador

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


Agora que você pode detectar quando um jogador coletou uma moeda, esta seção do tutorial ensina você a contar quantas moedas os jogadores coletaram e tornar essa quantia visível em uma tabela de classificação.

Crie um script de módulo para registrar a coleção de moedas

Para lidar com o armazenamento e a gestão dos dados de coleção de moedas de cada jogador, você precisa criar um objeto ModuleScript para conter uma estrutura de dados e funções que acessam os dados de coleção de moedas para cada jogador.Scripts de módulo são códigos reutilizáveis que outros scripts podem necessitar/requisitar.Neste caso, o CoinService requer este script de módulo para que possa atualizar os dados de coleção de moedas quando os jogadores tocarem nas moedas.

Para criar um script de módulo:

  1. Na janela Explorer , passe o mouse sobre Armazenamento do Servidor e clique no botão . Um menu contextual é exibido.

  2. Do menu contextual, selecione ModuleScript .Um novo script de módulo é exibido sob Armazenamento do Servidor .Você está colocando um script de módulo em Armazenamento do Servidor porque quer gerenciar a lógica de coleta de moedas no servidor.

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. Renomeie o script do módulo para Dados do Jogador .

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. Substitua o código padrão pelo seguinte código:


    local PlayerData = {}
    PlayerData.COIN_KEY_NAME = "Coins"
    local playerData = {
    --[[
    [userId: string] = {
    ["Coins"] = coinAmount: number
    }
    ]]
    }
    local DEFAULT_PLAYER_DATA = {
    [PlayerData.COIN_KEY_NAME] = 0
    }
    local function getData(player)
    local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end
    function PlayerData.getValue(player, key)
    return getData(player)[key]
    end
    function PlayerData.updateValue(player, key, updateFunction)
    local data = getData(player)
    local oldValue = data[key]
    local newValue = updateFunction(oldValue)
    data[key] = newValue
    return newValue
    end
    return PlayerData

    O script do módulo define uma tabela PlayerData que contém zero ou muitas tabelas playerData que representam dados de coleção de moedas para um jogador.Cada script que requer este script de módulo recebe a mesma cópia da tabela PlayerData, permitindo que vários scripts modifiquem e compartilhem dados de coleção de moedas.

    Declare as estruturas de dados

    O script do módulo começa com uma declaração de uma tabela vazia, PlayerData, que é retornada no final do script.Também contém métodos acessórios para obter e definir valores na tabela.

    A tabela playerData contém comentários que descrevem a estrutura da tabela, o que torna o código mais fácil de entender.Neste caso, uma tabela playerData contém um userId e um campo correspondente chamado Coins que representa a quantidade de moedas coletadas para esse jogador.


    local PlayerData = {}
    PlayerData.COIN_KEY_NAME = "Coins"
    local playerData = {
    --[[
    [userId: string] = {
    ["Coins"] = coinAmount: number
    }
    ]]
    }
    ...
    return PlayerData

    Defina um acessador de dados locais

    getData() é uma função local que recupera dados para uma tabela específica playerData .Se um jogador não coletou uma moeda, ele retorna uma tabela DEFAULT_PLAYER_DATA para garantir que cada jogador tenha alguns dados associados a eles.Uma convenção comum é criar funções simples e voltadas ao público que descarregam a lógica em funções localmente escopadas que fazem o levantamento pesado.


    local DEFAULT_PLAYER_DATA = {
    [PlayerData.COIN_KEY_NAME] = 0
    }
    local function getData(player)
    local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end

    Definir acessores de dados públicos

    getValue() e updateValue() são funções voltadas ao público que outros scripts que requerem este script de módulo podem chamar.Em nosso caso, o CoinService usa essas funções para atualizar os dados de coleção de moedas de um jogador sempre que esse jogador toca uma moeda.


    function PlayerData.getValue(player, key)
    return getData(player)[key]
    end
    function PlayerData.updateValue(player, key, updateFunction)
    local data = getData(player)
    local oldValue = data[key]
    local newValue = updateFunction(oldValue)
    data[key] = newValue
    return newValue
    end

Implementar uma tabela de classificação

Você pode representar os dados da coleção de moedas visualmente com uma tabela de classificação na tela.O Roblox inclui um sistema integrado que gera automaticamente uma tabela de classificação usando uma interface padrão.

Para criar a tabela de classificação:

  1. Na janela Explorer , crie um ModuleScript em Armazenamento do Servidor , então renomeie o script de módulo para Tabela de Líderes .

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. Substitua o código padrão pelo seguinte código:


    local Leaderboard = {}
    -- Criando uma nova tabela de classificação
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- O 'leaderstats' é um nome reservado que o Roblox reconhece para criar uma tabela de classificação
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Criando um novo valor de estatística de placares
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end
    -- Atualizando o valor de estatística de um jogador
    function Leaderboard.setStat(player, statName, value)
    local leaderstats = player:FindFirstChild("leaderstats")
    if not leaderstats then
    leaderstats = setupLeaderboard(player)
    end
    local stat = leaderstats:FindFirstChild(statName)
    if not stat then
    stat = setupStat(leaderstats, statName)
    end
    stat.Value = value
    end
    return Leaderboard

    As seções a seguir descrevem como a tabela de classificação funciona em mais detalhes.

    Crie uma tabela de classificação

    A função setupLeaderboard() cria uma nova instância de pasta chamada leaderstats e define-a como filha do jogador especificado.O Roblox reconhece automaticamente um diretório chamado leaderstats como um contêiner de estatísticas e cria um elemento de interface para exibir as estatísticas.Requer que os valores em leaderstats sejam armazenados como objetos de "valor" (como StringValue , IntValue ou NumberValue).


    -- Criando uma nova tabela de classificação
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- O 'leaderstats' é um nome reservado que o Roblox reconhece para criar uma tabela de classificação
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Criando um novo valor de estatística de placares
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    Atualizar estatísticas do jogador

    setStat() é a única função pública no módulo Placar .Cria valores de status para um jogador específico ou para a própria tabela de classificação se ela ainda não existir.

    FindFirstChild() toma o nome de um objeto e retorna o objeto se ele existir, ou nil se não existir.É um método comum e seguro de descobrir se um objeto existe antes de usá-lo.


    -- Atualizando o valor de estatística de um jogador
    function Leaderboard.setStat(player, statName, value)
    local leaderstats = player:FindFirstChild("leaderstats")
    if not leaderstats then
    leaderstats = setupLeaderboard(player)
    end
    local stat = leaderstats:FindFirstChild(statName)
    if not stat then
    stat = setupStat(leaderstats, statName)
    end
    stat.Value = value
    end

Integre os scripts do módulo

Com os scripts do módulo JogadorData e Tabela de Líderes completos, exija-os no script CoinService para gerenciar e exibir dados de moeda do jogador.Para atualizar CoinService :

  1. Na janela do Explorer , abra o script CoinService .

  2. Substitua o código existente pelo seguinte código:


    -- Inicializando serviços e variáveis
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Móveis
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    local coinsFolder = Workspace.World.Coins
    local coins = coinsFolder:GetChildren()
    local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
    local COOLDOWN = 10
    local COIN_AMOUNT_TO_ADD = 1
    local function updatePlayerCoins(player, updateFunction)
    -- Atualize a tabela de moedas
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
    -- Atualize a tabela de classificação de moedas
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    end
    -- Definindo o manipulador de eventos
    local function onCoinTouched(otherPart, coin)
    if coin:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Jogador tocou em uma moeda
    coin.Transparency = 1
    coin:SetAttribute("Enabled", false)
    updatePlayerCoins(player, function(oldCoinAmount)
    oldCoinAmount = oldCoinAmount or 0
    return oldCoinAmount + COIN_AMOUNT_TO_ADD
    end)
    task.wait(COOLDOWN)
    coin.Transparency = 0
    coin:SetAttribute("Enabled", true)
    end
    end
    end
    -- Configurando ouvintes de evento
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    As alterações no script original CoinService incluem:

    • Importando os módulos JogadorData e Tabela de Líderes com a função require()
    • Declarando COIN_AMOUNT_TO_ADD como o número de moedas a adicionar quando um jogador coleta uma moeda, e COIN_KEY_NAME como o nome da chave definido em Dados do Jogador .
    • Criar a função de auxílio updatePlayerCoins() para atualizar o número de moedas do jogador e o status da tabela de classificação associada.
    • Substituindo a declaração de espaço reservado por uma chamada para .

Teste de Jogo

É hora de ver se a coleção de moedas está funcionando como pretendido.Quando você toca e coleta uma moeda no jogo, você deve ser capaz de ver a quantidade de moedas que coletou na interface da tabela de classificação.Para testar a sua experiência:

  1. Na barra de ferramentas, clique no botão Jogar . O Studio entra no modo de teste de jogo.

    Play button highlighted in Studio's playtesting options.
  2. Mova seu personagem para tocar em uma moeda.Se seus scripts estiverem funcionando corretamente, a interface da tabela de classificação é exibida e aumenta o número de moedas que você coleta à medida que coleta mais moedas.