体験申込で

Amazonギフト

カードもらえる

体験申込・無料相談

News

お知らせ

ロブロックススタジオのスコアボードの作り方【リーダーボード実装】

コラム

Roblox Studio(ロブロックススタジオ)でゲームを作っていて、「プレイヤーのスコアを画面右上に表示したい」「キル数やコインの数を分かりやすく見せたい」と思ったことはありませんか。

チュートリアル動画通りにコードを書いたつもりでも、スコアが表示されなかったり、複数の項目を追加した途端に順番がバラバラになったりして、手が止まってしまう人は少なくありません。

この記事では、Roblox公式の仕組みである「leaderstats」を使ったスコアボード(リーダーボード)の作り方を、コピペで動くLuauコード付きで手順ごとに解説します。キル数・デス数のような複数項目の表示方法、表示順序を制御するPriorityの使い方、よくあるエラーの対処法まで一通りカバーするので、初めてスクリプトに触れる方でも迷わず実装できます。

Roblox公式のCreator Hub(create.roblox.com/docs)が公開しているリーダーボードのリファレンスをもとにしているので、情報の古さを気にせず読み進められます。

スコアボードとリーダーボードの違い

結論から言うと、Robloxの世界では「スコアボード」と「リーダーボード」はほぼ同じものを指します。画面右上に表示される、プレイヤー名とスコアの一覧です。

Roblox公式ドキュメントでは「leaderboard(リーダーボード)」という呼び方で統一されていますが、日本語の検索では「スコアボード」と呼ばれることも多いため、この記事ではどちらの呼び方でも同じ機能を指すものとして扱います。

実装の中身は、Robloxが用意している「leaderstats」という専用フォルダの仕組みを使うだけです。次の章から、その具体的な仕組みを見ていきます。

スコアボードの基本的な仕組み

Robloxのスコアボードは、特別なGUIを自分で作らなくても、決まったルールに従ってフォルダと値を用意するだけで自動的に画面へ表示されます。

leaderstatsフォルダとは

プレイヤーのオブジェクト(Player)の中に、leaderstatsという名前のFolderを作ると、Robloxがそれを自動的に検出し、画面右上のリーダーボードに表示してくれます。

フォルダの名前は必ず半角小文字で「leaderstats」と書く必要があります。「LeaderStats」のように大文字が混ざっていると、Robloxはリーダーボードとして認識しません。

IntValueでスコアを管理する

leaderstatsフォルダの中に、IntValue(整数値)やStringValue(文字列)を子オブジェクトとして追加すると、その名前と値がリーダーボードの列として表示されます。

  • スコアやコイン数など、数値を表示したいならIntValue
  • チーム名やランクなど、文字列を表示したいならStringValue

値を書き換えるときは、.Valueプロパティを通して操作します。次の章では、実際にServerScriptServiceへスクリプトを書いてスコアボードを完成させます。

スコアボードの作り方【手順】

ここからは、実際にスコアボードを動かすまでの手順をひとつずつ進めていきます。

ServerScriptServiceにスクリプトを作成する

Explorerウィンドウで「ServerScriptService」を右クリックし、「Insert Object」から「Script」を追加します。名前は分かりやすく「ScoreboardSetup」などにしておくとよいでしょう。

leaderstatsフォルダを追加する

プレイヤーがゲームに参加したタイミングでleaderstatsフォルダを作る処理を書きます。

local Players = game:GetService("Players")

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

Players.PlayerAdded:Connect(onPlayerAdded)

PlayerAddedイベントは、プレイヤーがサーバーに参加した瞬間に発火します。ここでフォルダを用意しておくことが、スコアボード表示の土台になります。

スコアの初期値を設定する

leaderstatsフォルダの中に、IntValueを追加してスコアの初期値を設定します。

local Players = game:GetService("Players")

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

	local score = Instance.new("IntValue")
	score.Name = "Score"
	score.Value = 0
	score.Parent = leaderstats
end

Players.PlayerAdded:Connect(onPlayerAdded)

ここまで書いた時点でPlaytestを実行すると、画面右上に「Score: 0」と表示されるリーダーボードが確認できますIntValueNameプロパティが、そのままリーダーボードの列名として表示される点を覚えておいてください。

スコアを更新する(イベント連動)

スコアを0のまま放置しても意味がないので、何かの条件でスコアが増える処理を追加します。例として、パーツに触れるとスコアが10増える仕組みを作ります。

local function addScore(player, amount)
	local leaderstats = player:FindFirstChild("leaderstats")
	if not leaderstats then
		return
	end

	local score = leaderstats:FindFirstChild("Score")
	if score then
		score.Value += amount
	end
end

local coinPart = workspace:WaitForChild("CoinPart")

coinPart.Touched:Connect(function(hit)
	local character = hit.Parent
	local player = Players:GetPlayerFromCharacter(character)

	if player then
		addScore(player, 10)
		coinPart:Destroy()
	end
end)

FindFirstChildleaderstatsScoreの存在を必ず確認してから.Valueを書き換えているのは、タイミングによって値がまだ用意されていない場合にエラーで処理が止まるのを防ぐためです。

 

 

複数のスコア項目を同時に表示する

対戦ゲームを作っていると、スコア以外にもキル数やデス数など、複数の項目を同時に表示したくなります。

キル数とデス数を表示する例

leaderstatsフォルダの中にIntValueを複数追加するだけで、項目を増やせます。

local Players = game:GetService("Players")

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

	local kills = Instance.new("IntValue")
	kills.Name = "Kills"
	kills.Value = 0
	kills.Parent = leaderstats

	local deaths = Instance.new("IntValue")
	deaths.Name = "Deaths"
	deaths.Value = 0
	deaths.Parent = leaderstats
end

Players.PlayerAdded:Connect(onPlayerAdded)

キル数を増やす処理は、プレイヤーがやられたタイミングで呼び出す関数として、既存のaddScoreと同じ考え方で書けます。

local function addKill(player)
	local leaderstats = player:FindFirstChild("leaderstats")
	if not leaderstats then
		return
	end

	local kills = leaderstats:FindFirstChild("Kills")
	if kills then
		kills.Value += 1
	end
end

表示順序をPriorityで制御する

項目が増えると、「キル数を一番左に表示したい」のように順番を指定したくなります。Roblox公式では、各IntValueの中にNumberValueを1つ追加し、名前をPriorityにすることで表示順を制御できます。

local function addStatWithPriority(leaderstats, statName, priorityValue)
	local stat = Instance.new("IntValue")
	stat.Name = statName
	stat.Value = 0
	stat.Parent = leaderstats

	local priority = Instance.new("NumberValue")
	priority.Name = "Priority"
	priority.Value = priorityValue
	priority.Parent = stat

	return stat
end

Priorityの値が大きいほど、リーダーボードの前方(左側)に表示されます。「キル数を一番目立たせたい」なら、キル数のPriorityをデス数より大きい値に設定してください。

さらに、特定の項目を常に一番前に固定したい場合は、IsPrimaryという名前のBoolValueを追加しtrueに設定すると、Priorityの値に関わらずその項目が最優先で表示されます。

よくあるエラーと対処法

スクリプトの書き方は合っているのにスコアボードが正しく動かない、という相談で特に多いのが次のパターンです。

症状 原因 対処法
リーダーボードが何も表示されない フォルダ名が「leaderstats」になっていない(大文字混在や誤字) Nameプロパティを半角小文字の「leaderstats」に修正する
スコアが増えない player:FindFirstChild("leaderstats")がnilを返している PlayerAddedの処理が先に実行されているか、Print文で確認する
Playtestでは表示されるが公開後に消える LocalScript側でSetCoreGuiEnabledによりリーダーボード自体を非表示にしている StarterGui内のスクリプトでPlayerListを無効化していないか確認する
項目の順番が意図通りにならない PriorityのNumberValueを追加していない、または数値の大小関係が逆 前方に出したい項目のPriorityを他より大きい数値にする

よくある質問(FAQ)

Q1. スコアボードとリーダーボードの違いは何ですか?

Robloxでは同じ機能を指します。公式ドキュメントは「リーダーボード」と呼びますが、日本語では「スコアボード」という呼び方もよく使われます。

Q2. leaderstatsというフォルダ名は変更できますか?

できません。Robloxはこの名前のフォルダだけを自動検出する仕組みになっているため、必ず半角小文字の「leaderstats」にする必要があります。

Q3. スコアをゲーム終了時に自動リセットするには?

ラウンド終了処理の中で、各プレイヤーのleaderstats配下の値に対してstat.Value = 0を実行すれば、次のラウンド開始時にスコアをリセットできます。

Q4. 複数のスコア項目(キル数・コイン数など)を追加できますか?

できます。leaderstatsフォルダの中にIntValueを必要な数だけ追加すれば、その分だけ列が増えます。表示順を指定したい場合はPriorityを使ってください。

Q5. スコアボードを非表示にする方法はありますか?

StarterGuiに配置したLocalScriptでStarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, false)を実行すると、リーダーボード自体を非表示にできます。

 

 

まとめ

この記事では、Roblox Studioでスコアボード(リーダーボード)を作る方法を解説しました。

重要なポイント:

  • 「leaderstats」という名前のFolderをPlayerの中に作ると、自動でリーダーボードに表示される
  • 表示したい項目ごとにIntValueやStringValueを追加し、Nameが列名になる
  • 複数項目を扱うときは、Priorityという名前のNumberValueで表示順序を制御できる
  • 特定の項目を最優先で表示したいときは、IsPrimaryという名前のBoolValueを使う
  • スコアが表示されないときは、まずフォルダ名の綴りとFindFirstChildの結果を確認する

まずは1つのスコア項目から動かしてみて、表示される仕組みが理解できたら、キル数やコイン数など自分のゲームに合った項目を増やしてみてください。

TETRA UPのRobloxコースでは、こうしたスクリプトの基礎から一つずつ、プロのインストラクターと一緒に手を動かしながら学べます。自分だけの対戦ゲームやスコアシステムを、実際に形にしてみませんか。

 

 

あわせて読みたい

コラム