レベルと経験のシステムは、プレイヤーがゲーム内でより多くの時間を過ごすように促す最も人気のあるゲームメカニズムの1つです。この記事では、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 = "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を作成する
レベルと経験の表示を美しくしましょう。 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 " .. 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チャンネル。質問をしたり、プロジェクトを共有したり、経験豊富な開発者からサポートを受けたりできます! 🚀
