{}const=>[]async()letfn</>var
DesarrolloLua

Sistema de niveles y subidas de nivel en Roblox: una guía completa de cero a héroe

Guía paso a paso para crear un sistema de niveles y experiencia en Roblox Studio. Aprende a hacer la progresión del personaje, guardar los datos del jugador, la visualización de XP y el aumento automático de los niveles. ¡Código listo y ejemplos para tu juego!

К

Kodik

Autor

5 min de lectura

El sistema de niveles y experiencia es una de las mecánicas de juego más populares que motiva a los jugadores a desarrollarse y pasar más tiempo en el juego. En este artículo, analizaremos cómo crear un sistema de nivelación básico pero funcional en Roblox Studio.

¿Qué vamos a crear?

Crearemos un sistema donde:

  • El jugador recibe experiencia (XP) por diversas acciones

  • Al acumular una cierta cantidad de experiencia, el nivel aumenta

  • El progreso se guarda entre las sesiones de juego

  • La pantalla muestra el nivel actual y el progreso

🔥 100.000+ estudiantes ya están con nosotros

¿Cansado de leer teoría?
¡Hora de programar!

Kodik — una app donde aprendes a programar con práctica. Mentor IA, lecciones interactivas, proyectos reales.

🤖 IA 24/7
🎓 Certificados
💰 Gratis
🚀 Empezar
Se unieron hoy

Paso 1: Creación de una estructura de datos

En primer lugar, tenemos que decidir qué datos almacenaremos para cada jugador. Vamos a crear un script en ServerScriptService con el nombre LevelSystem:

local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("PlayerLevels")

-- Настройки системы уровней
local DEFAULT_LEVEL = 1
local DEFAULT_XP = 0

local XP_PER_LEVEL = 100      -- Базовое количество опыта для первого уровня
local XP_MULTIPLIER = 1.5     -- Множитель сложности каждого уровня

Aquí hemos definido los parámetros básicos de nuestro sistema. XP_MULTIPLIER significa que cada nivel posterior requiere 1,5 veces más experiencia.

Paso 2: Función de cálculo de la experiencia necesaria

Vamos a crear una función que calcula la cantidad de experiencia necesaria para alcanzar el siguiente nivel:

local function getXPForLevel(level)
    -- Формула: базовый_опыт * (множитель ^ (уровень - 1))
    return math.floor(
        XP_PER_LEVEL * (XP_MULTIPLIER ^ (level - 1))
    )
end

Esta fórmula hace que el juego sea más equilibrado: cada nivel requiere más experiencia, lo que crea una progresión de la dificultad.

Paso 3: Inicialización de los datos del jugador

Cuando un jugador entra en el servidor, tenemos que cargar sus datos o crear otros nuevos:

local function setupPlayerData(player)
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player

    local level = Instance.new("IntValue")
    level.Name = "Level"
    level.Parent = leaderstats

    local xp = Instance.new("IntValue")
    xp.Name = "XP"
    xp.Parent = leaderstats

    -- Загружаем сохранённые данные
    local success, data = pcall(function()
        return playerData:GetAsync(player.UserId)
    end)

    if success and data then
        level.Value = data.Level or DEFAULT_LEVEL
        xp.Value = data.XP or DEFAULT_XP
    else
        level.Value = DEFAULT_LEVEL
        xp.Value = DEFAULT_XP
    end
end

game.Players.PlayerAdded:Connect(setupPlayerData)

La carpeta leaderstats se muestra automáticamente en la lista de jugadores de Roblox, lo que es útil para la depuración.

Paso 4: Función de añadir experiencia

Ahora creemos la función principal: añadir experiencia al jugador:

local function addXP(player, amount)
    local level = player.leaderstats.Level
    local xp = player.leaderstats.XP

    -- Добавляем опыт
    xp.Value = xp.Value + amount

    -- Проверяем, достаточно ли опыта для повышения уровня
    local xpNeeded = getXPForLevel(level.Value)

    while xp.Value >= xpNeeded do
        -- Повышаем уровень
        xp.Value = xp.Value - xpNeeded
        level.Value = level.Value + 1

        -- Уведомляем игрока
        local message = Instance.new("Message")
        message.Text = "Congratulations! You have reached " .. level.Value .. " level!"
        message.Parent = player.PlayerGui

        wait(3)
        message:Destroy()

        -- Обновляем требование для следующего уровня
        xpNeeded = getXPForLevel(level.Value)
    end
end

Presta atención al ciclo while: es necesario en caso de que el jugador haya recibido mucha experiencia a la vez y pueda saltar varios niveles.

Paso 5: Guardar el progreso

Es importante guardar los datos del jugador cuando sale del juego:

local function savePlayerData(player)
    local success, err = pcall(function()
        playerData:SetAsync(player.UserId, {
            Level = player.leaderstats.Level.Value,
            XP = player.leaderstats.XP.Value,
        })
    end)

    if not success then
        warn("Failed to save player data: " .. err)
    end
end

game.Players.PlayerRemoving:Connect(savePlayerData)

-- Автосохранение каждые 5 минут
while true do
    wait(300) -- 5 минут

    for _, player in pairs(game.Players:GetPlayers()) do
        savePlayerData(player)
    end
end

Paso 6: Ejemplos de uso

Ahora podemos dar experiencia para diversas acciones. Por ejemplo, para derrotar al enemigo:

-- В скрипте врага
local function onDeath()
    -- Логика определения игрока, убившего врага
    local killer = nil

    if killer then
        addXP(killer, 25) -- Даём 25 опыта
    end
end

O por la recogida de monedas:

-- В скрипте коллекционного предмета
local function onTouch(hit)
    local player = game.Players:GetPlayerFromCharacter(hit.Parent)

    if player then
        addXP(player, 10)
        script.Parent:Destroy()
    end
end

script.Parent.Touched:Connect(onTouch)

Paso 7: Creación de una interfaz de usuario para mostrar el progreso

Vamos a añadir una bonita visualización del nivel y la experiencia. Crea ScreenGui en StarterGui con el nombre LevelUI, y dentro de él Frame para el panel:

-- LocalScript в StarterGui
local player = game.Players.LocalPlayer
local gui = script.Parent

-- Создаём элементы интерфейса
local frame = Instance.new("Frame")
frame.Size = UDim2.new(0, 300, 0, 80)
frame.Position = UDim2.new(0, 10, 0, 10)
frame.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
frame.Parent = gui

local levelLabel = Instance.new("TextLabel")
levelLabel.Size = UDim2.new(1, 0, 0.4, 0)
levelLabel.Position = UDim2.new(0, 0, 0, 0)
levelLabel.BackgroundTransparency = 1
levelLabel.TextColor3 = Color3.new(1, 1, 1)
levelLabel.TextScaled = true
levelLabel.Parent = frame

local progressBar = Instance.new("Frame")
progressBar.Size = UDim2.new(0.9, 0, 0.2, 0)
progressBar.Position = UDim2.new(0.05, 0, 0.6, 0)
progressBar.BackgroundColor3 = Color3.fromRGB(100, 100, 100)
progressBar.Parent = frame

local progressFill = Instance.new("Frame")
progressFill.Size = UDim2.new(0, 0, 1, 0)
progressFill.BackgroundColor3 = Color3.fromRGB(0, 255, 0)
progressFill.Parent = progressBar

-- Функция обновления UI
local function updateUI()
    local level = player.leaderstats.Level.Value
    local xp = player.leaderstats.XP.Value

    local xpNeeded =
        -- вызов функции расчёта (через RemoteFunction)

    levelLabel.Text =
        "Level " .. level .. " | " .. xp .. "/" .. xpNeeded .. " XP"

    progressFill.Size = UDim2.new(xp / xpNeeded, 0, 1, 0)
end

-- Обновляем при изменении значений
player.leaderstats.Level.Changed:Connect(updateUI)
player.leaderstats.XP.Changed:Connect(updateUI)

updateUI()

Mejoras adicionales

Aquí hay algunas ideas sobre cómo se puede ampliar este sistema:

1. Premios por nivel

local LEVEL_REWARDS = { [5] = {Coins = 100}, [10] = {Coins = 250, Item = "SpecialSword"}, [20] = {Coins = 500} }

2. Diferentes fuentes de experiencia

addXP(player, 50, "Quest") addXP(player, 10, "Killing the enemy") addXP(player, 5, "Research")

3. Impulsos de experiencia

local function addXP(player, amount, hasBoost) if hasBoost then amount = amount * 2 -- Удвоенный опыт end -- остальной кодend

Conclusión

¡Hemos creado un sistema completo de niveles y de subida de nivel para jugar a Roblox! Este sistema incluye:

  • Acumulación de experiencia

  • Aumento de los niveles con dificultad progresiva

  • Guardar datos

  • Visualización del progreso

¡Esto y mucho más se puede aprender en el Códice!

Analizamos temas interesantes en detalle, paso a paso, con explicaciones claras y tareas prácticas. No solo leerás la teoría, sino que también consolidarás tus conocimientos en la práctica creando proyectos reales.

Y si necesitas ayuda — ya tenemos un gran equipo de personas de ideas afines en activo Canal de Telegram. ¡Haz preguntas, comparte tus proyectos y recibe ayuda de desarrolladores experimentados! 🚀

🎯Deja de postergar

¿Te gustó el artículo?
¡Hora de practicar!

En Kodik no solo lees — escribes código de inmediato. Teoría + práctica = habilidades reales.

Práctica instantánea
🧠IA explica código
🏆Certificado

Sin registro • Sin tarjeta