「自分のゲームをクリアした人にバッジをあげたい」「バッジってお金がかかるの?」
ロブロックス(Roblox)で自分のゲームにバッジを作る方法を、実際の画像付きで誰でも簡単に分かるように解説します。バッジは、ゲームの中で何かをやりとげた人がもらえる「しるし」です。もらったバッジは、その人のロブロックスの持ち物に残ります。
オビーの作り方で作ったコースを使い、ゲームに入った人に「初めて来た」、ゴールに乗った人に「ゴールした」のバッジを渡します。ほかのゲームでもらったバッジの見方や消し方ではなく、自分のゲームにバッジを作る方法です。
中級ステップ15/28 前の記事:ロブロックス(Roblox)でチームを作る方法 全体の順番を見る
使うもの:Roblox Studioが起動するパソコン、ブラウザ(ここではChrome)、Robloxに保存したゲーム。スクリプトの入れ方はゲームパスの作り方と同じ流れです。
今回の完成状態:下の画像のように、ゴールの黄色い床に乗ると画面の右下に「授与されたバッジ」が出て(画像の1)、出力に「(アカウント名) に「ゴールした」を渡しました」と出れば成功です(画像の2)。

バッジとゲームパスの違い
| バッジ | ゲームパス | |
|---|---|---|
| もらい方 | ゲームの中で決めたことをすると、無料でもらえる | Robuxで買う |
| 作る人の費用 | 1日5個までは無料(下の表) | 作るのは無料。売れると収益になる |
| 向いているもの | クリア、初めての参加、隠し場所の発見 | ずっと使える特典 |
1. バッジの画像を用意する
バッジの画像は、公式の案内では「512×512ピクセル」で作ります。アップロードすると円の形に切り取られるので、大事な文字や絵は円の内側に収めます。左は円の内側に収めた例、右は文字が円の外にあって切れてしまう例です。

アップロードの画面には「フォーマット:.jpg、.png、.tga、.bmp」と出ていました。ここではPNGで作りました。
2. バッジを作るのにかかる費用
作成の画面に出ている注意は、次の表のとおりです。
| 作る数 | 費用 |
|---|---|
| 1個目〜5個目 | 無料 |
| 6個目から | 1個ごとに100 Robux |
| 数え方 | ゲーム(バーチャル空間)ごと、24時間(グリニッジ標準時)ごと |
2個だけ作るなら無料です。無料で作りたいときは、1つのゲームで24時間に作るのを5個までにします。
3. Creator Hubでバッジを作る
バッジは、Robloxに保存したゲームにだけ作れます。まだ保存していないときは、ゲームを公開する方法の手順で先に保存してください。公開の設定が非公開のままでも、バッジは作れました。
バッジは、Creator Hub(ゲームの設定やバッジを作る、Robloxの制作者向けのサイト)で作ります。ブラウザでcreate.roblox.com/dashboard/creationsを開くと、作ったゲームが「バーチャル空間」に並んでいます。バッジを付けたいゲームのカードを押してください(赤い枠)。赤い枠や番号は、その手順で押す場所です。ボタンの名前や置き場所は、Roblox側の更新で変わることがあります。

ゲームの画面が開きます。左のメニューの「エンゲージメント」を押すと、右の「▼」が「▲」に変わり、中の項目が開きます(赤い枠)。

エンゲージメントの中の「バッジ」を押します(赤い枠)。

バッジの画面が開いたら、「バッジ を作成」を押します(赤い枠)。

作成の画面が開きます。最初はメダルの絵が入っています。右の「変更する」(赤い枠)を押すと、パソコンの中の画像を選べる窓が開くので、用意した画像を選んでください。

選んだ画像が、左に表示されます(赤い枠)。画像の右には「画像は、内容審査終了後に他の方々に表示されます」と出ています。

名前(画像の1)と詳細(画像の2)を入れます。画像を選ぶと、名前の欄にファイル名が自動で入るので、消してから入れ直します。名前は50文字まで、詳細は1000文字までです。詳細には、どうすればもらえるかを書きます。

「バッジが有効です」(画像の1)は、オンのままにします。その下に無料で作れる数の注意(画像の2)が出ているのを確かめて、「バッジを作成」(画像の3)を押します。

続けて、2個目の「ゴールした」を作ります。
- 左のメニューの「エンゲージメント」の中の「バッジ」を押してバッジの画面を開き、「バッジ を作成」を押します。
- 作成の画面で、メダルの絵の右の「変更する」を押し、用意した「ゴールした」の画像を選びます。
- 名前の欄に自動で入ったファイル名を消して、「ゴールした」と入れます。
- 詳細の欄に「ゴールの黄色い床に乗るともらえます。」と入れます。
- 「バッジが有効です」がオンのままで、無料で作れる数の注意が出ているのを確かめてから「バッジを作成」を押します。
バッジの画面に2つ並び、どちらにも「アクティブ」と出ました(赤い枠)。

画像が砂時計の絵になっているのは、画像の審査が終わっていないためです。審査が終わるまでの間も、バッジはもらえました。
4. バッジのIDをコピーする
スクリプトでバッジを渡すには、バッジの番号(ID)が要ります。
まず、バッジの画面で「初めて来た」のカードを押します。「初めて来た」の画面が開きます。
開いた画面で、名前の右にある縦に3つ点が並んだボタン(三点リーダー)を押します。
出てきたメニューの「アセットIDをコピー」(赤い枠)を押すと、IDがコピーされます。2つのバッジのIDは、メモ帳などに控えておくと便利です。

この画像は、画像の審査が終わったあとに撮ったので、作った画像が出ています。
続けて「ゴールした」のIDもコピーします。左上の「バッジに戻る」を押してバッジの画面に戻り、「ゴールした」のカードを押します。開いた画面で、名前の右の三点リーダーを押し、メニューの「アセットIDをコピー」を押します。
IDは、バッジを作ったゲームの中でだけ使えます。別のゲームに作ったバッジのIDを入れても、渡せません。
5. バッジを渡すスクリプトを入れる
Roblox Studioを起動すると、作品一覧の画面(ホーム画面)が出ます。左メニューの「バーチャル空間」を押し、バッジを作ったゲームのカードを押して開きます。開き方の画像はRoblox Studioの使い方の「保存して、同じ作品を開き直す」にあります。ここでは、オビーの作り方で作ったコースが入ったゲームを使っています。エクスプローラのWorkspaceの中の「FirstObby」の左の三角を押して開き、ゴールの黄色い床「Goal」が入っていることを確かめます(あとで貼るコードの7行目で、この2つの名前を使います)。
エクスプローラの「ServerScriptService」にマウスを乗せて「+」を押します(赤い枠)。

検索欄に「Script」と入れ、一覧の「Script」を押します(赤い枠)。

エクスプローラで入ったScriptを選んでF2キーを押し、名前を「BadgeGiver」に変えます(赤い枠)。

RunContextは、スクリプトをサーバーとプレイヤーのパソコンのどちらで動かすかを決める設定です。入れたばかりのScriptのRunContextは「Legacy」になっています。Robloxの公式の説明によると、バッジはサーバーで動くScript(RunContextが「Server」か「Legacy」)から渡します。この記事では、ほかの記事とそろえて「Server」にします。
エクスプローラでBadgeGiverを選んだ状態で、プロパティの検索欄に「RunContext」と入力し、「▼動作」の欄にあるRunContextの一覧から「Server」を選びます(赤い枠)。

エクスプローラでBadgeGiverをダブルクリックして開き、中身を全部消して、次のコードを貼り付けます。4行目と5行目の数字は、4でコピーした自分のバッジのIDに書きかえてください。
local Players = game:GetService("Players")
local BadgeService = game:GetService("BadgeService")
local WELCOME_BADGE_ID = 3036191375608837 -- 「初めて来た」バッジのID
local GOAL_BADGE_ID = 2403247233036027 -- 「ゴールした」バッジのID
local goal = workspace:WaitForChild("FirstObby"):WaitForChild("Goal")
-- 人ごとに「渡している途中」「渡し終えた」を覚えておく
local given = {}
local function giveBadge(player, badgeId)
local list = given[player]
if not list or list[badgeId] then
return -- 抜けた人、渡している途中、渡し終えたバッジは何もしない
end
list[badgeId] = "busy"
-- すでに持っているか確かめる(通信するので pcall で包む)
local ok, hasBadge = pcall(BadgeService.UserHasBadgeAsync, BadgeService, player.UserId, badgeId)
if not ok then
warn("持っているか確かめられませんでした:", hasBadge)
list[badgeId] = nil -- 次に触れたときにもう一度試す
return
end
if hasBadge then
print(player.Name .. " はもう持っています:", badgeId)
list[badgeId] = true
return
end
-- バッジが有効か確かめる
local okInfo, info = pcall(BadgeService.GetBadgeInfoAsync, BadgeService, badgeId)
if not okInfo then
warn("バッジの情報を取れませんでした:", info)
list[badgeId] = nil
return
end
if not info.IsEnabled then
warn("バッジ「" .. info.Name .. "」が無効になっています")
list[badgeId] = nil
return
end
-- バッジを渡す
local awarded, result = pcall(BadgeService.AwardBadgeAsync, BadgeService, player.UserId, badgeId)
if awarded and result then
list[badgeId] = true
print(player.Name .. " に「" .. info.Name .. "」を渡しました")
else
warn("バッジを渡せませんでした:", result)
list[badgeId] = nil
end
end
local function onPlayerAdded(player)
if given[player] then return end -- 同じ人を2回数えない
given[player] = {}
giveBadge(player, WELCOME_BADGE_ID) -- 入ってきた人に「初めて来た」
end
Players.PlayerAdded:Connect(onPlayerAdded)
for _, player in Players:GetPlayers() do
onPlayerAdded(player) -- スクリプトより先に入っていた人の分
end
Players.PlayerRemoving:Connect(function(player)
given[player] = nil
end)
-- ゴールに触れた人に「ゴールした」
goal.Touched:Connect(function(hit)
local character = hit.Parent
local player = Players:GetPlayerFromCharacter(character)
if not player then return end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid or humanoid.Health <= 0 then return end
giveBadge(player, GOAL_BADGE_ID)
end)
貼り付けると、4・5行目にバッジのID(画像の1)、7行目にゴールの場所(画像の2)が入り、エクスプローラのServerScriptServiceの中にBadgeGiver(画像の3)が見えます。

| コードの部分 | していること |
|---|---|
| UserHasBadgeAsync | すでに持っている人には渡さない。2回目に入った人は「初めて来た」をもらわない |
| GetBadgeInfoAsync の IsEnabled | バッジの情報で有効になっていないと分かったときは渡さず、出力に「が無効になっています」と出す |
| AwardBadgeAsync | 実際にバッジを渡す。通信するので pcall(エラーが起きてもスクリプトを止めずに結果を受け取るしくみ)で包む。「ゴールした」は、失敗しても次にゴールに触れたときにやり直す |
| given | 渡している途中と渡し終えたバッジを覚えておき、同じ人に重ねて渡そうとしない |
| goal.Touched | ゴールの床に触れたのがプレイヤーのときだけ「ゴールした」を渡す |
自分で作った別のコースで使うときは、7行目を、ゴールのパーツの場所に合わせて書きかえます。たとえばWorkspaceに直接「Goal」を置いたときは workspace:WaitForChild("Goal") です。
古い記事やコードでは、AwardBadge(Asyncが付かない名前)が使われていることがあります。Robloxの公式の説明には、こちらは古い名前なので、代わりにAwardBadgeAsyncを使うよう書かれています。
6. テストでバッジをもらう
3D画面の上の作品のタブ「アソビシフト練習3」を押して3D画面に戻り、F5キーでテストを始めます(タブの名前はパソコンによって違います)。ゲームに入ってすぐ、出力に「(アカウント名) に「初めて来た」を渡しました」と出ました(赤い枠)。

コースを渡ってゴールの黄色い床に乗ると、画面の右下に「授与されたバッジ」と「ゴールした」を獲得したという通知が出て(画像の1)、出力にも「(アカウント名) に「ゴールした」を渡しました」と出ます(画像の2)。

Shift + F5キーでテストを停止します。
もう一度、3D画面の上の作品のタブ「アソビシフト練習3」を押して3D画面に戻り、F5キーでテストを始めます(タブの名前はパソコンによって違います)。今度は出力に「(アカウント名) はもう持っています: (バッジのID)」と出て、バッジは渡されませんでした(赤い枠)。

Studioのテストで渡したバッジも、本当にアカウントに付きます。そのため作った本人も、一度もらったバッジはテストのたびにはもらえません。2回目のテストで「はもう持っています」と出たのは、このためです。
持ち物は、ロブロックスのサイトで見られます。Shift + F5キーでテストを停止してから、3で使ったブラウザのCreator Hubの画面に戻り、左のメニューのいちばん下にある「Roblox.com」(赤い枠)を押します。

ロブロックスのホームが開きます。左のメニューの「持ち物」(赤い枠)を押します。

持ち物の画面の「カテゴリ」で「バッジ」(画像の1)を押すと、「ゴールした」と「初めて来た」が入っていました(画像の2)。

以下は、アソビシフト編集部がStudioのテストと持ち物の画面で確かめた結果です。
| 試したこと | 結果 |
|---|---|
| 1回目のテストでゲームに入る | 「(アカウント名) に「初めて来た」を渡しました」と出る |
| ゴールの床に乗る | 右下に「授与されたバッジ」、出力に「(アカウント名) に「ゴールした」を渡しました」 |
| 2回目のテストでゲームに入る | 「(アカウント名) はもう持っています: (バッジのID)」と出て、渡されない |
| ロブロックスの持ち物→バッジ | 2つとも入っていた |
バッジがもらえないときの確かめ方
公式の説明にある、バッジを渡すための条件と、このコードの出力の文を結び付けました。
| 出力の文・様子 | 考えられる原因 | 直す場所 |
|---|---|---|
| 「(アカウント名) はもう持っています: (バッジのID)」 | その人がすでに持っている | 直す必要はない。スクリプトは動いていて、同じ人に2回渡さないようにしている |
| 「が無効になっています」 | 「バッジが有効です」がオフ | Creator Hubのバッジの設定 |
| 「渡せませんでした」 | 別のゲームのバッジのIDを入れている | バッジを作ったゲームの「エンゲージメント」→「バッジ」からIDをコピーし直す |
| 「持っているか確かめられませんでした」「情報を取れませんでした」 | IDの数字がまちがっている、通信の失敗 | 4・5行目のIDをコピーし直す。少し待ってもう一度試す |
| 何も出ない | ScriptがServerScriptServiceにない、LocalScriptに書いている | ServerScriptServiceのScriptに入れる。バッジはクライアント側からは渡せない |
| 何も出ず、数秒後に黄色い「Infinite yield possible」の警告が出る | ゴールの名前か場所が違う(7行目で待ち続けるため、「初めて来た」も渡されない) | 7行目の「FirstObby」「Goal」の名前がエクスプローラと同じか(Infinite yield possibleの直し方) |
AIに相談するときの伝え方
Roblox Studioで、バッジを渡すスクリプトを作っています。
ServerScriptServiceのScriptで、BadgeServiceのUserHasBadgeAsync・GetBadgeInfoAsync・AwardBadgeAsyncを使い、ゴールのパーツに触れた人にバッジを渡しています。
(ここに今のコードを貼る)
3つのチェックポイントをすべて通った人にだけ、別のバッジを渡すように書きかえてください。古いAwardBadgeは使わないでください。
よくある質問
バッジを消すことはできる?
撮影したCreator Hubのバッジの画面には、消すボタンはありませんでした。渡すのをやめたいときは、バッジの設定で「バッジが有効です」をオフにします。この記事のコードでは、バッジの情報で有効になっていないと分かったときは渡さずに、出力に「バッジ「(バッジの名前)」が無効になっています」と出します。
バッジの並び順は変えられる?
バッジの画面の「順序変更」から変えられます。Robloxの公式の説明によると、一度に50個まで並べかえられます。
次は、お金をためて機械を買い足すタイクーンを作ります。次のステップ(中級 16/28)
次に知りたいことを選ぶ
- 次のステップ:お金をためて機械を買い足すタイクーンを作ります → ロブロックス(Roblox)スタジオでタイクーンを作る方法
- バッジを渡すコースを作りたい → ロブロックス(Roblox)でオビーを作る方法
- チェックポイントごとにバッジを渡したい → ロブロックス(Roblox)のチェックポイントの作り方
- お金で買える特典を作りたい → ロブロックス(Roblox)のゲームパスの作り方