ロブロックス(Roblox)のゲームパスの作り方|販売設定と、買った人に特典を付けるスクリプトを画像で解説

制作手順難易度: 中級所要時間: 約40分(目安)情報確認日: 2026年10月30日

「自分のゲームでゲームパスを売りたい」「パスを作ったのに、買った人に何も起きない」

ロブロックス(Roblox)のゲームパスの作り方を、実際の画像付きで誰でも簡単に分かるように解説します。この記事では、買った人の頭の上に「応援メンバー」と表示されるパスを例に、Creator Hub(ゲームやパスを管理するRobloxのWebページ)でパスを作って販売をオンにするところから、Studioで特典を付けるスクリプトを置き、テストで確かめるところまで進めます。

中級ステップ4/28 前の記事:ロブロックス(Roblox)のRemoteEventの使い方 全体の順番を見る

使うもの:Roblox Studioが起動するパソコン、ブラウザ(Chromeなど)、Studioの「ファイル」→「Robloxに公開」でRobloxに送ったゲーム。公式の説明では、パスを作る前にゲームを公開してRobloxで開ける状態にしておきます。スクリプトの入れ方はスクリプトの作り方、ボタンの作り方はボタンの作り方で画像付きで解説しています。

今回の完成状態:下の画像のように、パスを持っている人がゲームに入ると、頭の上に黄色い「応援メンバー」が出れば成功です。

ゲームパスとは?開発者製品との違い

ゲームパスは、ゲームの中の特典をRobux(ロバックス)で買えるようにする商品です。Creator Hubの作成画面には「1人のプレイヤーにつき1回しか購入できない特別なアイテム」と書かれています。一度買えばずっと使える特典に向いています。

売りたいもの選ぶ仕組み
頭の上の表示、専用エリアに入れる権利など、一度買えばずっと使えるものゲームパス(この記事)
コイン、回復アイテムなど、使ったらまた買うもの開発者製品

コインのように何回でも買ってもらう商品は、開発者製品という別の仕組みで売ります。

大事なのは、パスを作って販売しただけでは、ゲームの中では何も起きないことです。「パスを持っている人には特典を付ける」というスクリプトを、自分でゲームに入れる必要があります。

1. Creator Hubでパスを作る

ブラウザでcreate.roblox.com/dashboard/creationsを開くと、作ったゲームが「バーチャル空間」に並んでいます。パスを売りたいゲームのカードを押してください(赤い枠)。赤い枠や番号は、その手順で押す場所です。ボタンの名前や置き場所は、Roblox側の更新で変わることがあります。

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

収益化の中の「パス」を押します(赤い枠)。

パスの画面が開いたら、右上の「パスを作成」を押してください(赤い枠)。

パスを作成する画面では、まずアイコンの画像を選びます。最初は灰色のチケットの絵が入っていて、右の「変更する」(赤い枠)を押すと、ファイルを選ぶ画面が開きます。使う画像を選び、右下の「開く」を押します。

画像を選んだら、名前(画像の1)、詳細(画像の2)を入れて、「パスを作成」(画像の3)を押します。

入れた内容は次のとおりです。

項目入れた内容
アイコン自分で作った「応援」の丸い画像
名前応援メンバーパス
詳細このゲーム内で、キャラクターの頭上に「応援メンバー」と表示されます。強さや報酬は変わりません。

2026年10月29日に更新された公式の説明では、名前と詳細のあとに、パスのカテゴリ(ゲーム内のショップで商品を分ける分類)を選ぶ手順が入っています。

アイコンの画像は、画面に出ているとおりjpg・png・bmpが使えます。公式の案内では、512×512ピクセルを超えない画像にし、丸く切り取られても大事なところが欠けないようにするよう書かれています。

詳細には、買った人に何が起こるかをはっきり書いてください。書いたことと、ゲームで実際に起こることがずれないようにするのが大切です。

2. パスIDを控える

パスを作ると、一覧に戻ります。「パスID」の列に出ている数字(赤い枠)が、スクリプトで使うパスの番号です。メモ帳などに控えておきましょう。

作ったばかりのパスは、「現在の価格」が「非売品」になっています。この状態ではまだ買えません。

3. 販売をオンにして価格を決める

一覧でパスの名前「応援メンバーパス」(赤い枠)を押すと、パスの設定が開きます。

設定の画面で、左の「販売」(赤い枠)を押してください。

右上の「販売中のアイテム」(画像の1)をオンにして、価格(画像の2)にRobuxの数を入れ、「変更を保存」(画像の3)を押します。ここでは100 Robuxにしました。

価格の下にある「管理された価格設定」は、国や地域ごとの価格と、価格を試すテスト(価格最適化)をRobloxがまとめて受け持つ仕組みです。2026年10月29日に更新された公式の説明では、パスの地域別価格は、新しいパスにもすでにあるパスにも最初からオンになっています。地域によっては、決めた価格の30%〜100%の範囲で安く売られます。100 Robuxのパスなら、30〜100 Robuxです。

手順の画面(2026年10月11日)では、このスイッチはオフのまま保存しています。公式の説明では、決めた価格のまま売りたいときはCreator Hubの「収益化」→「パス」でパスを選び、「Disable Managed Pricing(管理された価格設定を無効にする)」を押します。オンのままだとゲームの中の購入画面に出る金額が人によって変わることがあるので、自分で作るボタンには「100 Robux」のような金額を書かないようにします。

4. 特典を付けるスクリプトを置く

ここからはRoblox Studioで、パスを作ったゲームを開いて作業します。Roblox Studioを起動し、最初の画面の左の「バーチャル空間」を押します(画像の1)。Robloxに保存した作品が並ぶので、1でパスを作ったゲーム(Creator Hubでカードを押したのと同じゲーム。ここでは「Asobishift Practice 3」)のカードを押して開きます(画像の2)。

この記事のゲームは、開いたあとの3D画面の上の作品のタブに「アソビシフト練習3」と出ます。

スクリプトは次の2つです。

置く場所名前種類やること
ServerScriptServiceSupporterPassScriptパスを持っているか確かめて、頭の上に表示を付ける
StarterGui > SupporterShop > OpenPassButtonOpenPassLocalScriptボタンが押されたら購入画面を開く

特典を付けるかどうかは、サーバーで動くScriptが決めます。遊ぶ人のパソコンやスマホで動くLocalScriptは、購入画面を開くだけにします。

サーバーのスクリプト

エクスプローラの「ServerScriptService」にマウスを乗せて、右に出る「+」(赤い枠)を押します。

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

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

続けてSupporterPassを選んだまま、プロパティの検索で「RunContext」と入力し、「▼動作」の欄にあるRunContextの一覧から「Server」(赤い枠)を選びます。RunContextは、スクリプトをサーバーと遊ぶ人のパソコンのどちらで動かすかを決める設定です。

SupporterPassのタブ(開いていなければエクスプローラでSupporterPassをダブルクリック)で中身を全部消して、次のコードを貼り付けます。コードの4行目、PASS_IDの「2026940722」は、この記事で作ったパスの番号です。自分で控えたパスIDに書きかえてください。

local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")

local PASS_ID = 2026940722 -- 作成したパスIDに置き換える
assert(PASS_ID > 0, "SupporterPass: PASS_IDを設定してください")

local states = {}

local function showTag(player, character)
    local state = states[player]
    if not state or not state.owns then return end
    local head = character:WaitForChild("Head", 10)
    if not head or player.Parent ~= Players
        or player.Character ~= character or states[player] ~= state then
        return
    end
    if head:FindFirstChild("AsobishiftSupporterTag") then return end

    local tag = Instance.new("BillboardGui")
    tag.Name = "AsobishiftSupporterTag"
    tag.Adornee = head
    tag.Size = UDim2.fromOffset(180, 36)
    tag.StudsOffset = Vector3.new(0, 3, 0)
    tag.AlwaysOnTop = false
    tag.MaxDistance = 70

    local label = Instance.new("TextLabel")
    label.Size = UDim2.fromScale(1, 1)
    label.BackgroundTransparency = 1
    label.Text = "応援メンバー"
    label.TextColor3 = Color3.fromRGB(255, 220, 90)
    label.TextStrokeTransparency = 0.2
    label.TextScaled = true
    label.Parent = tag
    tag.Parent = head
end

local function grant(player)
    local state = states[player]
    if not state or player.Parent ~= Players then return end
    state.owns = true
    if player.Character then
        task.spawn(showTag, player, player.Character)
    end
end

local function setupPlayer(player)
    if states[player] or player.Parent ~= Players then return end
    local state = { owns = false }
    states[player] = state
    player.CharacterAdded:Connect(function(character)
        showTag(player, character)
    end)

    for attempt = 1, 3 do
        local ok, owns = pcall(function()
            return MarketplaceService:UserOwnsGamePassAsync(player.UserId, PASS_ID)
        end)
        if player.Parent ~= Players or states[player] ~= state then return end
        if ok then
            if owns then grant(player) end
            return
        end
        warn("SupporterPass: 所有確認に失敗", player.UserId, attempt, owns)
        if attempt < 3 then task.wait(attempt * 2) end
    end
    warn("SupporterPass: 所有確認が未完了です。時間を置いて再参加してください")
end

MarketplaceService.PromptGamePassPurchaseFinished:Connect(function(player, passId, purchased)
    if passId == PASS_ID and purchased then
        grant(player)
    end
end)

Players.PlayerAdded:Connect(setupPlayer)
Players.PlayerRemoving:Connect(function(player)
    states[player] = nil
end)
for _, player in Players:GetPlayers() do
    task.spawn(setupPlayer, player)
end

このコードがしていることは、次の3つです。

場面すること
ゲームに入ったとき「UserOwnsGamePassAsync」でパスを持っているか確かめ、持っていれば頭の上に表示を付ける
ゲームの中で買ったとき「PromptGamePassPurchaseFinished」で、買ったのが今回のパスで、本当に買えたときだけ表示を付ける
倒れて復活したとき新しいキャラクターにも表示を付け直す

持っているかの確認が通信の失敗で取れなかったときは、「持っていない」と決めつけず、最初の1回を含めて3回まで、2秒・4秒と間をあけて確かめます。

購入画面を開くボタン

エクスプローラの「StarterGui」にマウスを乗せて、右に出る「+」(赤い枠)を押します。

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

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

次に、エクスプローラのSupporterShopにマウスを乗せて、右に出る「+」を押します(赤い枠)。

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

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

ボタンのプロパティは、次のようにしました。

対象プロパティ値
SupporterShopResetOnSpawnオフ
OpenPassButtonText応援パスの価格を確認
OpenPassButtonSize{0, 260},{0, 60}
OpenPassButtonPosition{0, 20},{1, -80}
OpenPassButtonTextScaledオン

まず、エクスプローラでSupporterShopを選んだ状態で、プロパティの検索欄に「ResetOnSpawn」と入力し、ResetOnSpawnのチェックを外します(赤い枠)。ResetOnSpawnは、アバターが倒れて復活するたびに画面の表示を作り直す設定です。外しておくと、復活してもボタンが作り直されません。

次に、エクスプローラでOpenPassButtonを選び、次の4つを1つずつ変えます。

  1. OpenPassButtonを選んだ状態で、プロパティの検索欄に「Text」と入力します。似た名前の欄が並ぶので、名前がちょうどTextの欄(最初は「Button」)を「応援パスの価格を確認」に変えてEnterキーを押します(下の1枚目)
  2. 続けてOpenPassButtonを選んだまま、プロパティの検索欄に「Size」と入力します。AbsoluteSizeなどが並ぶので、名前がちょうどSizeの欄に「{0, 260},{0, 60}」と入れてEnterキーを押します。ボタンが大きくなります(下の2枚目)
  3. 続けてOpenPassButtonを選んだまま、プロパティの検索欄に「Position」と入力します。AbsolutePositionと並ぶので、名前がちょうどPositionの欄に「{0, 20},{1, -80}」と入れてEnterキーを押します。「{1, -80}」は、画面のいちばん下から80ピクセル上という意味です。ボタンが画面の左下に移ります(下の3枚目)
  4. 続けてOpenPassButtonを選んだまま、プロパティの検索欄に「TextScaled」と入力し、TextScaledにチェックを入れます。文字がボタンいっぱいの大きさになります(下の4枚目)

最後に、エクスプローラのOpenPassButtonにマウスを乗せて「+」を押します(赤い枠)。

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

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

OpenPassのタブ(開いていなければエクスプローラでOpenPassをダブルクリック)で中身を全部消して、次のコードを貼り付けます。コードの6行目のPASS_IDも、サーバーのスクリプトと同じ数字に書きかえてください。

local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local button = script.Parent

local PASS_ID = 2026940722 -- サーバー側と同じパスID
local busy = false

button.Activated:Connect(function()
    if busy then return end
    busy = true
    button.Text = "確認中…"

    local ok, owns = pcall(function()
        return MarketplaceService:UserOwnsGamePassAsync(player.UserId, PASS_ID)
    end)
    if not ok then
        button.Text = "確認失敗・後でもう一度"
        warn("OpenPass: 所有確認に失敗", owns)
    elseif owns then
        button.Text = "所有済み"
    else
        local opened, message = pcall(function()
            MarketplaceService:PromptGamePassPurchase(player, PASS_ID)
        end)
        button.Text = opened and "購入画面で内容を確認" or "表示失敗・後でもう一度"
        if not opened then warn("OpenPass: 購入画面の表示に失敗", message) end
    end

    task.delay(3, function()
        busy = false
        if button.Parent then button.Text = "応援パスの価格を確認" end
    end)
end)

エクスプローラが次の画像の赤い枠のように並べば、準備は完了です。

ボタンのコードは、まだ持っていない人には購入画面を開き、持っている人には「所有済み」と出すだけです。表示を付けるかどうかはボタンでは決めず、サーバーのスクリプトに任せています。購入画面を閉じただけの人やキャンセルした人に、特典が付いてしまうのを防ぐためです。

5. テストで特典が付くか確かめる

3D画面の上の作品のタブ「アソビシフト練習3」を押して3D画面に戻り、F5キーでテストを始めます(タブの名前はパソコンによって違います)。パスを作ったアカウントでテストすると、作った本人は最初からパスを持っている扱いになります。そのため、入ってすぐ頭の上に「応援メンバー」が出ます(赤い枠)。

左下のボタンを押すと、持っている扱いなので購入画面は開かず、ボタンが「所有済み」に変わります(赤い枠)。3秒たつと元の文字に戻ります。

最後に、倒れたあとも表示が残るかを確かめます。Escキーを押すと出るメニューで、「リスポーン」を押します(赤い枠)。

確認の画面で、もう一度「リスポーン」を押します(赤い枠)。復活したあとも、頭の上に「応援メンバー」が出ていれば成功です。

Shift + F5キーでテストを停止します。

作った本人のアカウントは、最初からパスを持っている扱いになります。そのため、このテストで見られるのは「持っている人」の動きです。

ゲームパスが反映されないときの確かめ方

症状確かめるところ
ストアにパスが出ないパスの「販売」で「販売中のアイテム」がオンになっているか、保存したか
購入画面が開かない・違うものが出る2つのスクリプトのPASS_IDが、パスの一覧の「パスID」と同じ数字か
持っているのに表示が出ないSupporterPassがServerScriptServiceにあり、RunContextがServerか。出力に赤い文字や「所有確認に失敗」が出ていないか
ゲームの外で買ったのに出ない一度ゲームを抜けて入り直す
Robloxのホーム画面や検索にパスが出ないCreator Hubの「収益化」→「ショップ」で、パスが掲載(Listed)になっているか。公式の説明では、ゲームの外に出すには掲載が必要です

ゲームに入ったままストアのページなどゲームの外でパスを買った場合、公式の説明では、持っているかの確認結果が新しくなるまで数分かかることがあります。入り直せば、ゲームに入ったときの確認でもう一度調べられます。

公式の説明では、Studioのテスト購入ではパスが今のゲームのものかを確かめません。ほかのゲームのパスIDでも買えたように見えることがあり、公開したゲームではその購入は失敗します。公開する前に、2つのスクリプトのPASS_IDが、このゲームのパスの一覧にある「パスID」と同じかを確かめてください。

スクリプトが動いているか分からないときは、スクリプトが動かないときの確認手順で出力の見方を確かめてください。

AIに相談するときの伝え方

AIに直してもらうときは、どこまで動いていて、どこで止まったかを伝えます。

Robloxの自作ゲームに、ゲームパスを持っている人の頭上へ「応援メンバー」と表示する機能を入れています。
配置:ServerScriptService/SupporterPass(Script、RunContext=Server)、StarterGui/SupporterShop/OpenPassButton/OpenPass(LocalScript)
パスID:(数字)
試したこと:(例)作った本人のアカウントでStudioのテスト
起きたこと:(例)ボタンは「所有済み」になるが、頭上に表示が出ない
出力:(出力の文をそのまま貼る)
コード:(2つのスクリプトを貼る)
特典を付けるかどうかはサーバーで決める形のまま、原因の候補と確かめる順番を教えてください。

よくある質問

パスを作るのにお金はかかる?

この記事の手順では、パスを作るときも販売をオンにするときも、Robuxの支払いはありませんでした。お金が動くのは、だれかがパスを買ったときです。

ほかの人のゲームでパスを売ることはできる?

公式の案内では、2026年5月30日から、ゲームをまたいだパスの販売は無効になっています。この記事のように、自分のゲームの中で使う特典を売る形にします。ゲームをまたいでRobuxをやり取りする仕組みが必要なときは、公式は「Robuxの送金(Robux transfers)」を使うよう案内しています。

売れたRobuxはお金に換えられる?

条件を満たせば、DevExという制度で換金できます。条件や流れはロバックスの換金方法で解説しています。

次のステップ(中級 5/28)

次は、何回でも買えるアイテム(開発者製品)を売ります。

→ ロブロックス(Roblox)の開発者製品の作り方

次に知りたいことを選ぶ

次に読む記事