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:
Na janela Explorer , passe o mouse sobre Armazenamento do Servidor e clique no botão ⊕ . Um menu contextual é exibido.
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.
Renomeie o script do módulo para Dados do Jogador .
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_DATAplayerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerDataExplicação de códigoO 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 PlayerDataDefina 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_DATAplayerData[tostring(player.UserId)] = datareturn dataendDefinir 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]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueend
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:
Na janela Explorer , crie um ModuleScript em Armazenamento do Servidor , então renomeie o script de módulo para Tabela de Líderes .
Substitua o código padrão pelo seguinte código:
local Leaderboard = {}-- Criando uma nova tabela de classificaçãolocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- O 'leaderstats' é um nome reservado que o Roblox reconhece para criar uma tabela de classificaçãoleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Criando um novo valor de estatística de placareslocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Atualizando o valor de estatística de um jogadorfunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueendreturn LeaderboardExplicação de códigoAs 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çãolocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- O 'leaderstats' é um nome reservado que o Roblox reconhece para criar uma tabela de classificaçãoleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Criando um novo valor de estatística de placareslocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendAtualizar 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 jogadorfunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueend
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 :
Na janela do Explorer , abra o script CoinService .
Substitua o código existente pelo seguinte código:
-- Inicializando serviços e variáveislocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Móveislocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 10local COIN_AMOUNT_TO_ADD = 1local function updatePlayerCoins(player, updateFunction)-- Atualize a tabela de moedaslocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Atualize a tabela de classificação de moedasLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Definindo o manipulador de eventoslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Jogador tocou em uma moedacoin.Transparency = 1coin:SetAttribute("Enabled", false)updatePlayerCoins(player, function(oldCoinAmount)oldCoinAmount = oldCoinAmount or 0return oldCoinAmount + COIN_AMOUNT_TO_ADDend)task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Configurando ouvintes de eventofor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endExplicação de códigoAs alterações no script original CoinService incluem:
- 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:
Na barra de ferramentas, clique no botão Jogar . O Studio entra no modo de teste de jogo.
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.