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 um gráfico de classificação.

Crie um Script de Módulo para Coletar Moedas

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

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 será exibido.

  2. Do menu contextual, selecione ModuleScript . Um novo script de módulo é exibido em ServerStorage . Você está colocando um script de módulo em ServerStorage porque você deseja 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 PlayerData .

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. Substitua o código padrão com o 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. Todo script que requer este módulo script recebe a mesma cópia da tabela PlayerData, permitindo que vários scripts modifiquem e compartilhem dados de coleção de moedas.

    Declarando as Estruturas de Dados

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

    A tabela playerData contém comentários que descrevem a estrutura da tabela, o que facilita a compreensão do código. Neste caso, uma tabela playerData contém um campo userId e um campo correspondente chamado 1> Coins1> que representa a quantidade de moedas coletadas para aquele jogador.


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

    Definindo um acessório de dados local

    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 todos os jogadores tenham algum dado associado a eles. Uma convenção comum é criar funções simples e de fácil acesso que descarregam a lógica para funções locais de


    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

    Definindo acessores de dados públicos

    :`get:` e updateValue() são funções de front-end que outros scripts que requerem este módulo de script podem chamar. No nosso caso, o CoinService usa essas funções para atualizar os dados de coleção de moedas de um jogador sempre que ele 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 incorporado 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 ServerStorage , então renomeie o script de módulo para 1> Leaderboard1>.

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


    local Leaderboard = {}
    -- Criando uma nova tabela de classificação
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- '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 leaderboard
    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 mais detalhadamente.

    Criando uma Tabela de Líderes

    A função setupLeaderboard() cria uma nova instância de pasta chamada leaderstats e a define como filha do jogador especificado. O Roblox automaticamente reconhece uma pasta chamada


    -- Criando uma nova tabela de classificação
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- '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 leaderboard
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    Atualizando Estatísticas do Jogador

    setStat() é a única função pública no módulo Leaderboard . Cria valores de estatística para um jogador específico ou para o próprio Leaderboard se ele não já existir.

    FindFirstChild() leva o nome de um objeto e retorna o objeto se ele existir, ou nil se não. É um método comum e seguro de encontrar se um objeto existe antes de você 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 de Módulo

Com ambos os scripts de módulo PlayerData e Leaderboard concluídos, exige-os no script CoinService para gerenciar e exibir dados de moedas do jogador. Para atualizar 1>CoinService1> :

  1. Na janela Explorer , abra o script CoinService .

  2. Substitua o código existente com o 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ódulos
    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 gerenciador de eventos
    local function onCoinTouched(otherPart, coin)
    if coin:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- O 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 ouvidores de eventos
    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 PlayerData e Leaderboard com a função require().
    • Declarando COIN_AMOUNT_TO_ADD como o número de moedas para adicionar quando um jogador coleta uma moeda, e COIN_KEY_NAME como o nome da chave definido em PlayerData .
    • Criar a função de ajuda updatePlayerCoins() para atualizar o número de moedas do jogador e o status de leaderboard associado.
    • Substituindo a declaração de espaço reservado print() com uma chamada para onCoinTouched() .

Testar Jogo

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

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

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