{}const=>[]async()letfn</>var
開発Lua

Robloxのレベルとレベルアップシステム:ゼロからヒーローになるための完全ガイド

Roblox Studioでレベルと経験システムを作成するためのステップバイステップガイド。キャラクターの進行状況、プレイヤーデータの保存、XPの視覚的表示、自動レベルアップの作成方法を学びます。ゲーム用の既成コードとサンプル!

К

Kodik

著者

3分で読める

レベルと経験のシステムは、プレイヤーがゲーム内でより多くの時間を過ごすように促す最も人気のあるゲームメカニズムの1つです。この記事では、Roblox Studioで基本的かつ機能的なレベルアップシステムを作成する方法について説明します。

何を作成しますか?

当社は次のようなシステムを作成します。

  • プレイヤーはさまざまなアクションで経験値(XP)を獲得します

  • 一定量の経験を積むと、レベルが上がります

  • ゲームセッション間の進行状況が保存されます

  • 画面には現在のレベルと進行状況が表示されます

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

ステップ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 = "Congratulations! You have reached " .. level.Value .. " level!"
        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("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

ステップ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を作成する

レベルと経験の表示を美しくしましょう。 ScreenGuiStarterGui 名前付き 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 " .. 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, "Quest") addXP(player, 10, "Killing the enemy") addXP(player, 5, "Research")

3. 経験ブースト

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

結論

私たちは、Robloxでプレイするための本格的なレベルとレベルアップシステムを作成しました!このシステムには以下が含まれます。

  • 経験の蓄積

  • 難易度が上がるレベル

  • データの保存

  • 進捗状況の視覚的表示

これらやその他多くのことをコディックスで学ぶことができます!

わかりやすい説明と実践的な課題を通じて、興味深いテーマを段階的に詳しく分析します。理論を読むだけでなく、実際のプロジェクトを作成して、知識を実践に活かすことができます。

サポートが必要な場合 — 当社には、すでに積極的に活動している、志を同じくする人々の大きなチームがいます Telegramチャンネル。質問をしたり、プロジェクトを共有したり、経験豊富な開発者からサポートを受けたりできます! 🚀

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要