Система уровней и прокачки в Roblox: полный гайд от нуля до героя

Пошаговое руководство по созданию системы уровней и опыта в Roblox Studio. Научитесь делать прогрессию персонажа, сохранение данных игрока, визуальное отображение XP и автоматическое повышение уровней. Готовый код и примеры для вашей игры!

LuaРазработка

6 мин

Система уровней и опыта — это один из самых популярных игровых механик, который мотивирует игроков развиваться и проводить больше времени в игре. В этой статье мы разберём, как создать базовую, но функциональную систему прокачки в Roblox Studio.

Что мы будем создавать?

Мы сделаем систему, где:

  • Игрок получает опыт (XP) за различные действия

  • При накоплении определённого количества опыта повышается уровень

  • Прогресс сохраняется между сеансами игры

  • На экране отображается текущий уровень и прогресс

Шаг 1: Создание структуры данных

Первым делом нам нужно решить, какие данные мы будем хранить для каждого игрока. Создадим скрипт в ServerScriptService с названием 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     -- Множитель сложности каждого уровня

Здесь мы определили базовые параметры нашей системы. XP_MULTIPLIER означает, что каждый следующий уровень требует в 1.5 раза больше опыта.

Шаг 2: Функция расчёта необходимого опыта

Создадим функцию, которая рассчитывает, сколько опыта нужно для достижения следующего уровня:

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

Эта формула делает игру более сбалансированной — с каждым уровнем требуется всё больше опыта, что создаёт прогрессию сложности.

Шаг 3: Инициализация данных игрока

Когда игрок заходит на сервер, нам нужно загрузить его данные или создать новые:

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)

Папка leaderstats автоматически отображается в списке игроков в Roblox, что удобно для отладки.

Шаг 4: Функция добавления опыта

Теперь создадим главную функцию — добавление опыта игроку:

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 = "Поздравляем! Вы достигли " .. level.Value .. " уровня!"
        message.Parent = player.PlayerGui

        wait(3)
        message:Destroy()

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

Обратите внимание на цикл while — он нужен на случай, если игрок получил сразу много опыта и может перепрыгнуть через несколько уровней.

Шаг 5: Сохранение прогресса

Важно сохранять данные игрока, когда он выходит из игры:

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("Не удалось сохранить данные игрока: " .. 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

Шаг 6: Примеры использования

Теперь можем давать опыт за различные действия. Например, за победу над врагом:

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

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

Или за сбор монеток:

-- В скрипте коллекционного предмета
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)

Шаг 7: Создание UI для отображения прогресса

Давайте добавим красивое отображение уровня и опыта. Создайте ScreenGui в StarterGui с названием LevelUI, а внутри него Frame для панели:

-- 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 .. " | " .. 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()

Дополнительные улучшения

Вот несколько идей, как можно расширить эту систему:

1. Награды за уровень

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

2. Разные источники опыта

addXP(player, 50, "Квест") addXP(player, 10, "Убийство врага") addXP(player, 5, "Исследование")

3. Бусты опыта

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

Заключение

Мы создали полноценную систему уровней и прокачки для игры в Roblox! Эта система включает:

  • Накопление опыта

  • Повышение уровней с прогрессивной сложностью

  • Сохранение данных

  • Визуальное отображение прогресса

Это и многое другое можно изучить в Кодике!

Мы разбираем интересные темы подробно, шаг за шагом, с понятными объяснениями и практическими заданиями. Вы не просто прочитаете теорию, но и закрепите знания на практике, создавая реальные проекты.

А если нужна поддержка — у нас уже большая команда единомышленников в активном Telegram-канале. Задавайте вопросы, делитесь своими проектами и получайте помощь от опытных разработчиков! 🚀

Комментарии