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

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

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

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

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

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

    Definir 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]
    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 integrado que genera automáticamente una tabla de clasificación utilizando una interfaz de usuario predeterminada.

Para crear la tabla de clasificación:

  1. En la ventana Explorador , crea un ModuleScript en Almacenamiento del servidor , luego renombra el script de módulo a Tabla de clasificación .

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. Reemplazar 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 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ó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 .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 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

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 :

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

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


    -- Inicialización de 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 manipulador 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
    -- Configurar los oyentes de eventos
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    Los cambios al script original CoinService incluyen:

    • Importación de los módulos Datos del jugador y Tabla de clasificación con la función require().
    • 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:

  1. En la barra de herramientas, haz clic en el botón Jugar . Studio entra en modo de prueba de juego.

    Play button highlighted in Studio's playtesting options.
  2. 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.