「鬼ごっこで勝った回数を、テストやゲームを終えても残したい」「みんなの順位を表にして出したい」
ロブロックス(Roblox)スタジオでランキングを作る方法を、実際の画像付きで誰でも簡単に分かるように解説します。ここでは、鬼ごっこの作り方で作った鬼ごっこに、勝った回数を数える仕組みを足します。回数は右上の一覧(リーダーボード)に出し、Robloxのサーバーに保存して、多い順の上位5人を看板に出します。
上級ステップ9/40 前の記事:ロブロックス(Roblox)スタジオのUIの作り方 全体の順番を見る
使うもの:Roblox Studioが起動するパソコン、マウス、キーボード、鬼ごっこの作り方で作った作品。データの保存の基本はDataStoreの使い方、看板に文字を出す方法は文字を出す方法で解説しています。
今回の完成状態:下の画像のように、看板に勝った回数の多い順の順位(画像の1)が出て、右上の一覧に「Wins」(勝った回数、画像の2)が出れば成功です。下の画像は、アソビシフト編集部が2人でテストしたときのPlayer1の窓の画面です。看板は、看板のスクリプトのREFRESH_TIMEで決めた30秒ごとに書きかわります。そのため、看板の回数が一覧の数より少ないことがあります(手順9でくわしく説明します)。

ランキングの仕組み
この記事では、3つの部品を足します。
| 部品 | 種類 | 置き場所 | 役目 |
|---|---|---|---|
| Ranking | ModuleScript | ServerStorageのModuleScripts | 勝った回数の読み込み・保存・上位の取り出し |
| GameManager | Script(差し替え) | ServerScriptService | 勝った人が決まったら、Rankingに回数を足してもらう |
| RankingBoard | Part+SurfaceGui+TextLabel+Script | Workspace | 上位5人を30秒ごとに看板に出す |
勝った回数は、Robloxの「OrderedDataStore(オーダードデータストア)」に保存します。ふつうのDataStoreと同じくゲームを抜けても残る保存場所です。Robloxの公式の説明では、入れる値は整数(1、2、3のような数)に限られます。そのかわり、多い順・少ない順に並べて取り出せるのが特長です。
右上の一覧(リーダーボード)は、プレイヤーの中に「leaderstats」という名前のフォルダーを作ると出ます。この一覧に出るのは今のサーバーにいる人だけなので、抜けた人も入れた順位は看板で見せます。
1. 作品をRobloxに保存する
DataStoreは、Robloxに保存した作品でしか使えません。鬼ごっこの作り方で作った作品を開きます(パソコンに保存した場合は、上の「ファイル」から「ファイルから開く」で開きます)。開いたら、上の「ファイル」から「Robloxに保存」(赤い枠)を押します。

「バーチャル空間を公開」の窓が開きます。名前(画像の1)に作品の名前を入れ、右下の「作成」(画像の2)を押します。この記事では「Tag Arena Ranking」にしました。窓の名前は「公開」ですが、ここではRobloxに保存されるだけで、ほかの人が遊べるようにはなりません。

保存が終わると、Robloxに保存した作品として開き直されます。

2. Studioのテストで保存できるようにする
最初の設定では、Studioのテストからは保存の機能を使えません。2026年10月21日に、この設定をしないまま試すと、出力に「Studio access to APIs is not allowed」(StudioからのAPIの利用が許可されていません)と赤い文字が出ました。このあと作るRankingのスクリプトは、失敗をpcallで受け止めて知らせるので、同じ設定のまま動かしたときは、オレンジの文字(warn)で知らせが出ます。
上の「ファイル」から「バーチャル空間設定」(赤い枠)を押します。

「バーチャル空間設定」の窓が開きます。左の「セキュリティ」(画像の1)を押すと、「StudioのAPIサービスへのアクセスを有効化」(画像の2)のスイッチがオフになっています。

スイッチを押してオン(画像の1)にし、右下の「保存」(画像の2)を押します。

Robloxの公式の説明では、Studioのテストは、公開しているゲームと同じ保存場所を使います。遊ばれているゲームでは、この設定をオンにしないようにと書かれています。この記事のように、練習用の作品でだけオンにします。
3. 勝った回数を保存するModuleScriptを作る
ModuleScript(モジュールスクリプト)は、ほかのスクリプトから読みこんで使うためのスクリプトです。勝った回数の読み書きをRankingという1つのModuleScriptにまとめ、GameManagerと看板のスクリプトの両方から使います。
エクスプローラの「ServerStorage」の左の▶を押して開きます。中の「ModuleScripts」にマウスを乗せて、右に出る「+」(赤い枠)を押します。ModuleScriptsは、鬼ごっこの記事でGameSettingsを入れたフォルダーです。

開いた一覧の上の検索欄に「ModuleScript」と入力し、一覧の「ModuleScript」(赤い枠)を押します。

ModuleScriptを入れると、真ん中に中身の画面が開きます。エクスプローラでは、ModuleScriptsの中に入った「ModuleScript」が選ばれた状態になります。選ばれていないときは、エクスプローラの「ModuleScript」を押して選びます。
ModuleScriptを選んだ状態でF2キーを押し、名前を「Ranking」に変えてEnterキーを押します(赤い枠)。

真ん中のスクリプトの画面を押してから、Ctrl+Aキーで中身を全部選びます。中身を全部消して、次のコードを貼り付けます。
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
-- 勝った回数を、多い順に並べられる形で保存する
local winsStore = DataStoreService:GetOrderedDataStore("TagWins")
local Ranking = {}
-- 参加した人の右上に「Wins」を出し、保存してある回数を読み込む
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local wins = Instance.new("IntValue")
wins.Name = "Wins"
wins.Value = 0
wins.Parent = leaderstats
local success, saved = pcall(function()
return winsStore:GetAsync(tostring(player.UserId))
end)
if success and saved then
wins.Value = saved
elseif not success then
warn("勝った回数を読み込めませんでした: " .. tostring(saved))
end
end
Players.PlayerAdded:Connect(onPlayerAdded)
for _, player in Players:GetPlayers() do
task.spawn(onPlayerAdded, player)
end
-- 勝った人の回数を1増やして、すぐに保存する
function Ranking.addWin(player)
local leaderstats = player:FindFirstChild("leaderstats")
local wins = leaderstats and leaderstats:FindFirstChild("Wins")
if not wins then
return
end
local success, newValue = pcall(function()
return winsStore:IncrementAsync(tostring(player.UserId), 1)
end)
if success then
wins.Value = newValue
else
warn("勝った回数を保存できませんでした: " .. tostring(newValue))
end
end
-- 多い順に、上から count 人の { userId, wins } を返す
function Ranking.getTop(count)
local success, pages = pcall(function()
return winsStore:GetSortedAsync(false, count)
end)
if not success then
warn("ランキングを読み込めませんでした: " .. tostring(pages))
return {}
end
local list = {}
for _, entry in pages:GetCurrentPage() do
table.insert(list, { userId = tonumber(entry.key), wins = entry.value })
end
return list
end
return Ranking
貼り付けると、下の画像のようになります。画像には、コードの前半(41行目まで)が出ています。

4. GameManagerを書きかえる
エクスプローラの「ServerScriptService」の左の▶を押して開きます。中の「GameManager」をダブルクリックすると、真ん中にGameManagerのスクリプトの画面が開きます。
スクリプトの画面を押してから、Ctrl+Aキーで中身を全部選びます。中身を全部消して、次のコードを貼り付けます。鬼ごっこの記事のコードに、Rankingを使う3か所を足したものです。
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local Ranking = require(moduleScripts:WaitForChild("Ranking"))
local status = ReplicatedStorage:WaitForChild("Status")
local arena = workspace:WaitForChild("Arena")
local lobbySpawn = workspace:WaitForChild("SpawnLocation")
-- 体のある、生きている人だけを集める
local function getReadyPlayers()
local list = {}
for _, player in Players:GetPlayers() do
local humanoid = player.Character and player.Character:FindFirstChildOfClass("Humanoid")
if humanoid and humanoid.Health > 0 then
table.insert(list, player)
end
end
return list
end
-- 人を決めた場所へ動かす
local function moveTo(player, position)
if player.Character then
player.Character:PivotTo(CFrame.new(position))
end
end
-- ロビーへ戻す
local function sendToLobby(player)
moveTo(player, lobbySpawn.Position + Vector3.new(math.random(-6, 6), 4, math.random(-6, 6)))
end
-- メインのくり返し(待つ → 鬼ごっこ → 結果 → ロビーへ戻す)
while true do
-- 1. 人数がそろうまで待つ
repeat
local count = #getReadyPlayers()
if count < gameSettings.minimumPlayers then
status.Value = "あと " .. (gameSettings.minimumPlayers - count) .. " 人で始まります"
task.wait(1)
end
until #getReadyPlayers() >= gameSettings.minimumPlayers
-- 2. ロビーで数える
for seconds = gameSettings.intermissionDuration, 1, -1 do
status.Value = "鬼ごっこまで " .. seconds .. " 秒"
task.wait(1)
end
-- 3. 鬼を1人選んで、アリーナへ動かす
local players = getReadyPlayers()
if #players >= gameSettings.minimumPlayers then
local oni = players[math.random(1, #players)]
local runners = {}
local center = arena.Floor.Position
for _, player in players do
if player == oni then
moveTo(oni, center + Vector3.new(0, 4, -15))
else
runners[player] = true
moveTo(player, center + Vector3.new(math.random(-15, 15), 4, 15))
end
end
-- 鬼を赤く光らせて、だれが鬼か分かるようにする
local mark = Instance.new("Highlight")
mark.FillColor = Color3.fromRGB(255, 40, 40)
mark.Parent = oni.Character
local function countRunners()
local n = 0
for _ in runners do
n += 1
end
return n
end
-- 鬼にさわられた人は、つかまってロビーへ戻る
local connections = {}
for _, part in oni.Character:GetDescendants() do
if part:IsA("BasePart") then
table.insert(connections, part.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player and runners[player] then
runners[player] = nil
sendToLobby(player)
print(player.Name .. " がつかまりました")
end
end))
end
end
-- 途中で抜けた人を数から外す
table.insert(connections, Players.PlayerRemoving:Connect(function(player)
runners[player] = nil
end))
-- 4. 時間を数える。全員つかまるか、鬼が抜けたら早く終わる
for seconds = gameSettings.matchDuration, 0, -1 do
status.Value = "鬼ごっこ中! 残り " .. seconds .. " 秒(逃げる人 " .. countRunners() .. " 人)"
if countRunners() == 0 or oni.Parent == nil then
break
end
task.wait(1)
end
-- 5. 結果を出す
if countRunners() == 0 then
status.Value = "全員つかまった! 鬼(" .. oni.DisplayName .. ")の勝ち"
if oni.Parent then
Ranking.addWin(oni)
end
else
status.Value = "逃げきった! 逃げる人の勝ち"
for player in runners do
Ranking.addWin(player)
end
end
-- 6. 片付けて、全員をロビーへ戻す
for _, connection in connections do
connection:Disconnect()
end
mark:Destroy()
task.wait(gameSettings.transitionTime)
for _, player in Players:GetPlayers() do
sendToLobby(player)
end
end
end
足したのは、次の3か所です。
| 行 | 足したこと |
|---|---|
| 7行目 | local Ranking = require(...) でRankingを読みこむ |
| 113〜115行目 | 全員つかまえたら、鬼の回数を1足す |
| 118〜120行目 | 逃げきったら、逃げた人みんなの回数を1足す |
7行目(赤い枠)は、コードの上のほうにあります。

113〜115行目(画像の1)と118〜120行目(画像の2)は、「5. 結果を出す」のコメントの下にあります。スクリプトの画面の上にマウスを置いてホイールを手前に回し、左はしの行の番号を見ながら下へ動かすと見つけられます。

コード113行目のif oni.Parent then は、鬼がゲームから抜けていないかを確かめる行です。抜けた人の回数は足せないので、残っているときだけ足します。
5. ランキングの看板を置く
エクスプローラの「Workspace」にマウスを乗せて、右に出る「+」を押します。開いた一覧の上の検索欄に「Part」と入力し、一覧の「Part」を押します。
入ったPartが選ばれた状態でF2キーを押し、名前を「RankingBoard」に変えてEnterキーを押します(赤い枠)。

RankingBoardは、次の値にします。
| プロパティ | 値 |
|---|---|
| Size | 16, 10, 1 |
| Position(▼CFrameのすぐ下) | 0, 8, -30 |
| Color | 40, 40, 60(紺色) |
| Anchored | チェックを入れる |
1つずつ変えていきます。
- エクスプローラでRankingBoardを選んだ状態で、プロパティの検索欄に「Size」と入力します。Sizeの右の欄を押して「16, 10, 1」と入れ、Enterキーを押します(下の1枚目)。
- 続けてRankingBoardを選んだまま、プロパティの検索欄に「Position」と入力します。Positionは2つ出ます。▼CFrameのすぐ下のPositionの右の欄を押して「0, 8, -30」と入れ、Enterキーを押します(下の2枚目)。下の▼OriginのPositionも同じ値に変わります。看板は、スポーン地点とアリーナの間に立ちます。
- 続けてRankingBoardを選んだまま、プロパティの検索欄に「Color」と入力します。Colorの右の数字の部分を押して「40, 40, 60」と入れ、Enterキーを押します(下の3枚目)。看板が紺色になり、上のBrickColorは「Black」に変わります。
- 続けてRankingBoardを選んだまま、プロパティの検索欄に「Anchored」と入力します。Anchoredの右の四角を押して、チェックを入れます(下の4枚目)。Anchoredは、部品をその場に固定して、落ちたり倒れたりしないようにする設定です。
6. 看板に文字の欄を作る
看板に文字を出すには、SurfaceGui(サーフェスGUI)とTextLabel(テキストラベル)を使います。SurfaceGuiは、部品の面に文字や画像を貼るための入れ物です。TextLabelは、その中で文字を出す欄です。
エクスプローラの「RankingBoard」にマウスを乗せて、右に出る「+」を押します。開いた一覧の上の検索欄に「SurfaceGui」と入力し、一覧の「SurfaceGui」(赤い枠)を押します。

入ったSurfaceGuiは、エクスプローラで選ばれた状態になります。SurfaceGuiを選んだ状態で、プロパティの検索欄に「Face」と入力します。Faceは、看板のどの面に文字を貼るかを決める設定です。この記事の撮影では、Faceは最初「Front」(赤い枠)でした。Frontは、スポーン地点から見て看板の奥側の面です。

Faceが「Front」のときは、Faceの右の欄を押して、一覧から「Back」を選びます(赤い枠)。Backは、スポーン地点の側の面です。最初から「Back」なら、そのままでかまいません。

エクスプローラの「SurfaceGui」にマウスを乗せて、右に出る「+」を押します。開いた一覧の上の検索欄に「TextLabel」と入力し、一覧の「TextLabel」(赤い枠)を押します。

入ったTextLabelが選ばれた状態でF2キーを押し、名前を「BoardText」に変えてEnterキーを押します(赤い枠)。

BoardTextは、次の値にします。
| プロパティ | 値 |
|---|---|
| Size | {1, 0},{1, 0}(看板の面いっぱい) |
| TextScaled | チェックを入れる |
| BackgroundColor3 | 40, 40, 60(看板と同じ紺色) |
| TextColor3 | 255, 255, 255(白) |
1つずつ変えていきます。
- エクスプローラでBoardTextを選んだ状態で、プロパティの検索欄に「Size」と入力します。AbsoluteSizeではなく、その下のSizeの右の欄を押して「{1, 0},{1, 0}」と入れ、Enterキーを押します(下の1枚目)。
- 続けてBoardTextを選んだまま、プロパティの検索欄に「TextScaled」と入力します。TextScaledの右の四角を押して、チェックを入れます(下の2枚目)。文字の大きさが、欄の大きさに合わせて変わるようになります。
- 続けてBoardTextを選んだまま、プロパティの検索欄に「Color3」と入力します。BackgroundColor3(欄の背景の色)の右の数字の部分を押して「40, 40, 60」と入れ、Enterキーを押します。
- 同じ画面のTextColor3(文字の色)の右の数字の部分を押して「255, 255, 255」と入れ、Enterキーを押します(下の3枚目)。
7. 看板を書きかえるスクリプトを入れる
エクスプローラの「RankingBoard」にマウスを乗せて、右に出る「+」を押します。開いた一覧の上の検索欄に「Script」と入力し、一覧の「Script」(赤い枠)を押します。

Scriptを入れると、真ん中に「print("Hello world!")」と書かれたスクリプトの画面が開き、エクスプローラでは入ったScriptが選ばれた状態になります。Scriptを選んだ状態でF2キーを押し、名前を「RankingBoardScript」に変えてEnterキーを押します(赤い枠)。

続けてRankingBoardScriptを選んだまま、プロパティの検索欄に「RunContext」と入力します。RunContextの右の欄を押して、一覧から「Server」を選びます(赤い枠)。RunContext(ランコンテキスト)は、スクリプトをどこで動かすかを決める設定です。Serverにすると、このScriptはサーバー(ゲームの正しい状態を持っている側)で動きます。

真ん中のスクリプトの画面を押してから、Ctrl+Aキーで中身を全部選びます。中身を全部消して、次のコードを貼り付けます。
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Ranking = require(ServerStorage:WaitForChild("ModuleScripts"):WaitForChild("Ranking"))
local label = script.Parent:WaitForChild("SurfaceGui"):WaitForChild("BoardText")
local TOP_COUNT = 5 -- 看板に出す人数
local REFRESH_TIME = 30 -- 看板を書きかえる間かく(秒)
-- UserId から名前を調べる(調べられないときは番号のまま出す)
local function getName(userId)
-- Studio の2人テストの Player1・Player2 は、番号がマイナスになる
if userId < 0 then
return "Player" .. -userId
end
local success, name = pcall(function()
return Players:GetNameFromUserIdAsync(userId)
end)
return success and name or tostring(userId)
end
while true do
local lines = { "勝った回数ランキング" }
for rank, item in Ranking.getTop(TOP_COUNT) do
table.insert(lines, rank .. "位 " .. getName(item.userId) .. " " .. item.wins .. "回")
end
if #lines == 1 then
table.insert(lines, "まだだれも勝っていません")
end
label.Text = table.concat(lines, "\n")
task.wait(REFRESH_TIME)
end
貼り付けると、下の画像のようになります。

8. 1人でテストして、一覧と看板を確かめる
3D画面の上のいちばん左にある作品のタブ(1節で保存したときの作品の名前。編集部は「Tag Arena Ranking」)を押して3D画面に戻り、F5キーでテストを始めます。作品のタブの右には、Ranking・GameManager・RankingBoardScriptのスクリプトのタブが並んでいます。
以下は、アソビシフト編集部が1人でテストを始めたときの画面です。上に「あと 1 人で始まります」(画像の1)と出て、看板には「勝った回数ランキング まだだれも勝っていません」(画像の2)と出ました。

右上の一覧には、「Wins」の列に「0」(赤い枠)が出ます(一覧が出ないときはTabキーを押すと出ます)。

確かめたら、Shift + F5キーでテストを停止します。
9. 2人でテストして、回数が増えるか確かめる
次は、2人で遊ぶ様子を1台のパソコンで試す「2人テスト」です。サーバー(ゲームの正しい状態を持っている側)の窓と、Player1・Player2の窓が別々に開きます。やり方は鬼ごっこの作り方の2人テストと同じです。
画面左上の「テスト」と書かれた欄の右の「∨」を押し、一覧から「サーバーとクライアント」を選びます(画像の1)。
青い再生ボタン(画像の2)のさらに右にある人数の欄の「∧」を押して、「2」にします(画像の3)。
人数を決めてから、青い再生ボタン(画像の2)を押して、2人テストを始めます。

Player1とPlayer2の窓が開き、鬼ごっこが始まります。鬼は、ラウンドごとにGameManagerがランダムに選びます。
以下は、アソビシフト編集部が2026年10月21日に2人テストで確かめた結果です。このときは、Player2が鬼でした。Player2の窓を押してからW・A・S・Dキーで歩き、Player1の体にぶつかるとつかまえられます。鬼のPlayer2がPlayer1をつかまえると、上に「全員つかまった! 鬼(Player2)の勝ち」(赤い枠)と出ました。下の画像は、テスト中のPlayer1の窓です。

右上の一覧のPlayer2の「Wins」が「1」(赤い枠)になっていました(一覧が出ないときは、Player1の窓を押してからTabキーを押すと出ます)。

次のラウンドでは、Player1が鬼になりました。Player2が時間いっぱい逃げきると、Player2の「Wins」が「2」(画像の2)になりました。このとき看板には「1位 Player2 1回」(画像の1)と出ていました。

看板の回数が一覧より少ないのは、RankingBoardScriptのREFRESH_TIMEで決めた30秒ごとに、看板を書きかえているためです。看板は、次に書きかわるときに新しい回数になります。
10. テストをやり直して、回数が残っているか確かめる
元のStudioの窓の左上にある、赤い丸に縦の線のボタン(マウスを乗せると「セッションを終了」と出ます)を押して2人テストを止めます。
画面左上の「テスト」の欄が「サーバーとクライアント」、人数が「2」のままになっていることを確かめます。青い再生ボタンを押して、もう一度2人テストを始めます。
以下は、アソビシフト編集部が2人テストをやり直して確かめた結果です。鬼ごっこが始まったあとも、右上の一覧のPlayer2の「Wins」は「2」(赤い枠)のままでした。0に戻らず、前の回数から続いています。テストを止めても、勝った回数はRobloxのサーバーに残っています。

コードのしくみ
IncrementAsyncで、足すことと保存を同時にする
winsStore:IncrementAsync(キー, 1) は、保存してある数に1を足して保存し、足したあとの数を返します。キー(保存した値を見分けるための名前)には、プレイヤーごとに決まっている番号(UserId)を使っています。Studioの2人テストのPlayer1・Player2は、この番号がマイナスになります。そのため看板のスクリプトのgetNameでは、マイナスの番号を「Player1」「Player2」の名前にして出しています。
GetSortedAsyncで、多い順に取り出す
winsStore:GetSortedAsync(false, count) の false は「少ない順ではない」、つまり多い順の意味です。看板のスクリプトが count にTOP_COUNTで決めた5を入れているので、上から5人分が返ります。pages:GetCurrentPage() で、その5人の番号と回数を1人ずつ取り出しています。
pcallで、保存の失敗に備える
保存や読み込みは、Robloxのサーバーとのやりとりなので、失敗することがあります。pcall で包むと、失敗してもスクリプトが止まらず、出力にオレンジの文字(warn)で知らせます。
看板を30秒ごとに書きかえる理由
保存の読み書きには、回数の上限があります。看板を1秒ごとに書きかえると、それだけ多く読みこむことになります。看板のスクリプトのREFRESH_TIMEを30(秒)にして、読みこむ回数をおさえています。
Robloxの公式のリーダーボード(フレンド・グローバル)
Robloxの公式の説明では、右上の一覧には「Here(このサーバー)」「Friends(フレンド)」「Global(全体)」の3つの表示があります。FriendsとGlobalは、Creator HubでOrderedDataStoreを登録すると、その数で順位を出してくれる機能です。2026年10月の時点で、この機能はベータ版(試験中の機能)とされていて、1つの作品で同時に有効にできるのは1つだけです。内容や使える範囲は今後変わる可能性があるとも書かれています。Creator Hubで登録して有効にしたものだけが、FriendsとGlobalに出ます。
この記事の看板のランキングは、この登録をしなくても動きます。
うまく動かないときの直し方
| 症状 | 原因 | 直し方 |
|---|---|---|
| 出力に「Studio access to APIs is not allowed」 | Studioからの保存を許可していない | 上の「ファイル」→「バーチャル空間設定」→左の「セキュリティ」で、「StudioのAPIサービスへのアクセスを有効化」をオンにして「保存」を押す |
| 右上にWinsが出ない | Rankingが読みこまれていない | GameManagerの7行目が local Ranking = require(moduleScripts:WaitForChild("Ranking")) か確かめる。Rankingの名前と、ServerStorageのModuleScriptsの中にあるかを確かめる |
| 看板が「Label」のまま | SurfaceGui・BoardTextの名前ちがい、RankingBoardScriptが止まっている | エクスプローラで RankingBoard → SurfaceGui → BoardText の名前と並びを確かめる。出力の赤い文字を見る |
| 看板の文字が見えない | SurfaceGuiのFace | エクスプローラでSurfaceGuiを選び、プロパティの検索欄に「Face」と入れて、Faceを「Back」にする |
| 勝っても回数が増えない | GameManagerを差し替えていない | GameManagerの中身を全部消して、手順4のコードを貼り直す |
| テストをやり直すと0に戻る | Robloxに保存していない作品 | 上の「ファイル」→「Robloxに保存」で保存してから試す |
AIに相談するときの伝え方
Roblox StudioでOrderedDataStoreを使って、プレイヤーの勝った回数を保存し、上位5人を看板のTextLabelに出しています。
看板の順位の横に、勝った回数だけでなく、最後に勝った日も出したいです。どう保存すればよいか教えてください。
よくある質問
テストの回数が、公開したゲームの順位に混ざる?
Studioのテストは、公開しているゲームと同じ保存場所を使います。テストで足したPlayer1・Player2の回数(番号がマイナスの人)も、看板の順位に出ることがあります。Robloxの公式の説明では、遊ばれているゲームでは「StudioのAPIサービスへのアクセスを有効化」をオンにせず、テスト用に別の作品を用意してオンにするよう求めています。保存場所の名前("TagWins")を変えるだけでは、Studioのテストが本番の回数を書きかえるおそれが残ります。公開する作品ではこの設定をオフに戻し、試すときは練習用の作品を使います。
勝った回数ではなく、タイムの速い順にしたい
GetSortedAsync(true, count) にすると、少ない順に並びます。OrderedDataStoreには整数しか入らないので、秒数は100倍するなどして整数にしてから保存します。
次のステップ(上級 10/40)
次は、StudioのAIに日本語で頼んで、本棚やランタンのモデルを作ります。
次に知りたいことを選ぶ
- 次のステップ:StudioのAIに日本語で頼んで、本棚やランタンのモデルを作ります → ロブロックス(Roblox)スタジオでモデルを作る方法
- 鬼ごっこの仕組みをおさらいしたい → 鬼ごっこの作り方
- データの保存の基本を知りたい → DataStoreの使い方
- 看板に文字を出したい → 文字を出す方法






