Registrar y Mostrar Datos del Jugador

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.


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:

  1. En la ventana Explorer , pasa el cursor sobre almacenamiento del servidor y haz clic en el botón . Se muestra un menú contextual.

  2. 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.

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. Renombre el script del módulo a PlayerData .

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. 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_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

    El 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 PlayerData

    Definir 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_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end

    Definiendo 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]
    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 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:

  1. En la ventana Explorer , crea un ModuleScript en ServerStorage , luego renombra el script del módulo a 1> Leaderboard1> .

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. Reemplace el código predeterminado con el siguiente código:


    local Leaderboard = {}
    -- Crear una nueva tabla de clasificación
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 'leaderstats' es un nombre reservado que Roblox reconoce para crear una tabla de clasificación
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Crear un nuevo valor de estadística de tabla de clasificación
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end
    -- Actualizar el valor de estadística de un jugador
    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

    Las 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ón
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 'leaderstats' es un nombre reservado que Roblox reconoce para crear una tabla de clasificación
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Crear un nuevo valor de estadística de tabla de clasificación
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    Actualizar 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 jugador
    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

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> :

  1. En la ventana Explorador , abra el script CoinService .

  2. Reemplace el código existente con el siguiente código:


    -- Inicializando servicios y variables
    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)
    -- Actualizar la tabla de monedas
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
    -- Actualizar la tabla de clasificación de monedas
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    end
    -- Definiendo el gestor de eventos
    local function onCoinTouched(otherPart, coin)
    if coin:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- El jugador tocó una moneda
    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 evento escuchas
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    Las modificaciones en el script original CoinService incluyen:

    • Importando los módulos PlayerData y Leaderboard con la función require().
    • 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:

  1. En la barra de menú, haz clic en el botón Reproducir . Studio entra en modo de prueba de juego.

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. 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.