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
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))
)
endEsta 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
endPresta 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
endPaso 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
endO 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 -- остальной кодendConclusió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! 🚀
