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 han recogido los jugadores y hacer esa cantidad visible en una tabla de clasificación.
Crea un guión de módulo para registrar la recolección de colecciones
Para manejar los datos de colección de monedas de cada jugador, necesitas crear un objeto ModuleScript que contenga una estructura de datos y funciones que accedan a los datos de 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 script de módulo para que pueda actualizar los datos de recolección de monedas cuando los jugadores tocan las monedas.
Para crear un guión de script:
En la ventana Explorador , pasa el mouse sobre Almacenamiento del servidor y haz clic en el botón ⊕ . Se muestra un menú contextual.
Desde el menú contextual, seleccione ModuleScript .Un nuevo guión de módulo se muestra debajo de Almacenamiento del servidor .Estás colocando un script de módulo en Almacenamiento del servidor porque quieres administrar la lógica de la colección de monedas en el servidor.
Renombra el guión del módulo a PlayerData .
Reemplazar 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 de códigoEl guión del módulo define una tabla PlayerData que contiene cero o muchas tablas playerData que representan los datos de recolección de monedas para un jugador.Cada script que requiera este script de módulo recibe la misma copia de la tabla PlayerData, permitiendo que varios scripts modifiquen y compartan los datos de colección de monedas.
Declarar las estructuras de datos
El guión 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 auxiliares 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 correspondiente llamado Coins 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 PlayerDataDefina un accesor de datos local
getData() es una función local que recupera datos para una tabla específica playerData .Si un jugador no ha recogido una moneda, devuelve una tabla DEFAULT_PLAYER_DATA para asegurarse de que cada jugador tenga algunos datos asociados a ellos.Una convención común es crear funciones simples y de cara al público que transfieran la lógica a funciones de alcance local que hagan el levantamiento 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 accesores de datos públicos
getValue() y updateValue() son funciones que otras aplicaciones que requieren este script de módulo pueden llamar.En nuestro caso, el CoinService usa estas funciones para actualizar los datos de la colección de monedas de un jugador cada vez que ese jugador 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 integrado que genera automáticamente una tabla de clasificación utilizando una interfaz de usuario predeterminada.
Para crear la tabla de clasificación:
En la ventana Explorador , crea un ModuleScript en Almacenamiento del servidor , luego renombra el script de módulo a Tabla de clasificación .
Reemplazar 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 de códigoLas siguientes secciones describen 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 llamada leaderstats y la configura como hija del jugador especificado.Roblox reconoce automáticamente una carpeta llamada leaderstats como un contenedor de estadísticas y crea un elemento de interfaz de usuario para mostrar las estadísticas.Requiere que los valores en leaderstats se almacenen como objetos de "valor" (como StringValue , IntValue o NumberValue ).
-- 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 .Crea valores de estadísticas para un jugador específico o la tabla de clasificación en sí misma si aún no existe.
FindFirstChild() toma el nombre de un objeto y devuelve el objeto si existe, o nil si no lo hace.Es un método común y seguro de averiguar si existe un objeto 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
Integrar los scripts del módulo
Con los scripts del módulo Datos del jugador y Tabla de clasificación completos, requierenlos en el script CoinService para gestionar y mostrar los datos de la moneda del jugador.Para actualizar CoinService :
En la ventana Explorador , abra el script CoinService .
Reemplazar el código existente con el siguiente código:
-- Inicialización de 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 manipulador 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-- Configurar los oyentes de eventosfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endExplicación de códigoLos cambios al script original CoinService incluyen:
- Declarar COIN_AMOUNT_TO_ADD como el número de monedas a agregar cuando un jugador recoge una moneda, y COIN_KEY_NAME como el nombre de clave definido en PlayerData .
- Creación de la función ayudante updatePlayerCoins() para actualizar el recuento de monedas del jugador y el estado de la tabla de clasificación asociada
- Reemplazar la declaración de marcador de posición con una llamada a .
Prueba de juego
Es hora de ver si la colección de monedas está funcionando como se pretendía.Cuando toques y recojas una moneda en el juego, deberías poder ver la cantidad de monedas que has recogido en la interfaz de usuario de la tabla de clasificación.Para probar tu experiencia:
En la barra de herramientas, haz clic en el botón Jugar . Studio entra en modo de prueba de juego.
Mueve tu personaje para tocar una moneda.Si tus scripts funcionan correctamente, la interfaz de usuario de la tabla de clasificación se muestra y aumenta tu recuento de monedas a medida que recolectas más monedas.