Ahora que puedes detectar cuando un jugador ha recogido una moneda, esta sección del tutorial te enseña cómo contar cuántas monedas ha recogido un jugador y hacer esa cantidad visible en un tablero de clasificación.
Crea un Módulo de Script para Recolectar Monedas
Para gestionar la almacenamiento y administración de los datos de la colección de monedas de cada jugador, necesitas crear un objeto ModuleScript para contener una estructura de datos y funciones que acceden a los datos de la colección de monedas para cada jugador. Los scripts de módulo son código reutilizable que otros scripts pueden necesario, obligatorio. En este caso, el CoinService requiere este módulo de script para que pued
Para crear un módulo de script:
En la ventana Explorer , pasa el cursor sobre almacenamiento del servidor y haz clic en el botón ⊕ . Se muestra un menú contextual.
Desde el menú contextual, seleccione ModuleScript . Se muestra un nuevo script de módulo debajo de ServerStorage . Estás colocando un script de módulo en ServerStorage porque quieres administrar la lógica de recolección de monedas en el servidor.
Renombre el script del módulo a PlayerData .
Reemplace el código predeterminado con el siguiente 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 PlayerDataExplicación del códigoEl script del módulo define una tabla PlayerData que contiene cero o muchas tablas playerData, que representan datos de recolección de monedas para un jugador. Cada script que requiere este módulo script recibe la misma copia de la tabla PlayerData, lo que permite que varios scripts modifiquen y compartan datos de recolección de monedas.
Declarando las Estructuras de Datos
El script del módulo comienza con una declaración de una tabla vacía, PlayerData , que se devuelve al final del script. También contiene métodos de accesorios para obtener y establecer valores en la tabla.
La tabla playerData contiene comentarios que describen la estructura de la tabla, lo que hace que el código sea más fácil de entender. En este caso, una tabla playerData contiene un campo userId y un campo de nombre correspondiente llamado 1> Coins1> que representa la cantidad de monedas recolectadas para ese jugador.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--]][userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerDataDefinir un accesorio de datos local
getData() es una función local que recupera datos para una tabla específica de playerData. Si un jugador no ha recolectado una moneda,返回一个 DEFAULT_PLAYER_DATA tabla para asegurar que cada jugador tenga algunos datos asociados con ellos. Una convención común es crear funciones simples y de fácil acceso que descongestionan la lógica para funciones de bajo
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 dataendDefiniendo accesorios de datos públicos
getValue() y updateValue() son funciones de cara pública que otros scripts que requieren este módulo de script pueden llamar. En nuestro caso, el CoinService utiliza estas funciones para actualizar los datos de la moneda de un jugador siempre que toca una moneda.
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 una tabla de clasificación
Puedes representar los datos de la colección de monedas visualmente con una tabla de clasificación en la pantalla. Roblox incluye un sistema de generación de tabla de clasificación que se genera automáticamente con una interfaz de usuario predeterminada.
Para crear la tabla de clasificación:
En la ventana Explorer , crea un ModuleScript en ServerStorage , luego renombra el script del módulo a 1> Leaderboard1> .
Reemplace el código predeterminado con el siguiente código:
local Leaderboard = {}-- Crear una nueva tabla de clasificaciónlocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' es un nombre reservado que Roblox reconoce para crear una tabla de clasificaciónleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Crear un nuevo valor de estadística de tabla de clasificaciónlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Actualizar el valor de estadística de un jugadorfunction 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 LeaderboardExplicación del códigoLas siguientes secciones explican cómo funciona la tabla de clasificación con más detalle.
Crear una tabla de clasificación
La función setupLeaderboard() crea una nueva instancia de carpeta nombrada leaderstats y la establece como hija del jugador especificado. Roblox reconoce automáticamente una carpeta nom
-- Crear una nueva tabla de clasificaciónlocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' es un nombre reservado que Roblox reconoce para crear una tabla de clasificaciónleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Crear un nuevo valor de estadística de tabla de clasificaciónlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendActualizar estadísticas del jugador
setStat() es la única función pública en el módulo Tabla de clasificación . Creó valores de estadísticas para un jugador específico o la tabla de clasificación en sí misma si no ya existe.
FindFirstChild() toma el nombre de un objeto y devuelve el objeto si existe, o nil si no. Es un método común y seguro de encontrar si un objeto existe antes de usarlo.
-- Actualizar el valor de estadística de un jugadorfunction 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
Ingrese los Script del Módulo
Con ambos scripts de módulo PlayerData y Leaderboard completados, requírelos en el script de módulo CoinService para administrar y mostrar los datos de moneda del jugador. Para actualizar 1>CoinService1> :
En la ventana Explorador , abra el script CoinService .
Reemplace el código existente con el siguiente código:
-- Inicializando servicios y variableslocal 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)-- Actualizar la tabla de monedaslocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Actualizar la tabla de clasificación de monedasLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Definiendo el gestor de eventoslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- El jugador tocó una monedacoin.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 evento escuchasfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endExplicación del códigoLas modificaciones en el script original CoinService incluyen:
- Declarando COIN_AMOUNT_TO_ADD como el número de monedas que se agrega cuando un jugador recoge una moneda, y COIN_KEY_NAME como el nombre de la llave definido en PlayerData .
- Crear la función de ayudante updatePlayerCoins() para actualizar el recuento de monedas del jugador y la estadística de la tabla de clasificación asociada.
- Reemplazando la declaración de reemplazo print() con una llamada a onCoinTouched() .
Probar
Es hora de ver si la colección de monedas está funcionando como se esperaba. Cuando tocas y recolectas una moneda en el juego, deberías poder ver la cantidad de monedas que has recolectado en la interfaz de usuario de la tabla de clasificación. Para probar tu experiencia:
En la barra de menú, haz clic en el botón Reproducir . Studio entra en modo de prueba de juego.
Mueve tu personaje para tocar una moneda. Si tus scripts están funcionando correctamente, la interfaz de líder muestra y aumenta tu recuento de monedas mientras recolectas más monedas.