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:
Na janela Explorer , passe o mouse sobre Armazenamento do Servidor e clique no botão ⊕ . Um menu contextual será exibido.
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.
Renomeie o script do módulo para PlayerData .
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_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çã 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. 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 PlayerDataDefinindo 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_DATAplayerData[tostring(player.UserId)] = datareturn dataendDefinindo 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]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 incorporado 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 ServerStorage , então renomeie o script de módulo para 1> Leaderboard1>.
Substitua o código padrão com o seguinte código:
local Leaderboard = {}-- Criando uma nova tabela de classificaçãolocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- '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 leaderboardlocal 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çã de CódigoAs 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çãolocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- '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 leaderboardlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendAtualizando 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 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 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> :
Na janela Explorer , abra o script CoinService .
Substitua o código existente com o seguinte código:
-- Inicializando serviços e variáveislocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Móduloslocal 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 gerenciador de eventoslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- O 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 ouvidores de eventosfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endExplicaçã de CódigoAs alterações no script original CoinService incluem:
- 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:
Na barra de menu, clique no botão Jogar . Studio entra no modo de teste de jogo.
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.