「ロブロックスで、拾ったアイテムがたまっていく持ち物の画面を作りたい」「ゲームをやめても持ち物が残るようにしたい」
ロブロックス(Roblox)スタジオでインベントリ(持ち物)を作る方法を、実際の画像付きで誰でも簡単に分かるように解説します。ここでは、地面のりんご・石・水晶に近づいてEキーで拾うと数が増え、左下の「持ち物」ボタンを押すと、持っている物がマス目に並んで出る持ち物の画面を作ります。最後に、ゲームを抜けても数が残るように保存します。
上級ステップ14/40 前の記事:ロブロックス(Roblox)スタジオでガチャを作る方法 全体の順番を見る
使うもの:Roblox Studioが起動するパソコン、マウス、キーボード。近づくと「E ○○する」と出る部品(ProximityPrompt)はNPCの作り方、押すと開くボタンはボタンの作り方、保存のしくみ(DataStore)はDataStoreの使い方で解説しています。
先に答え
| 知りたいこと | 答え |
|---|---|
| 持ち物の数はどこで数える? | サーバーのスクリプトで、プレイヤーの中に作った「Inventory」というフォルダーの数字(IntValue)を増やす |
| 一覧の画面は? | ScrollingFrame(スクロールできる枠)の中にUIGridLayoutを入れると、マスが自動で横に並び、入りきらない分は下へスクロールして見られる |
| 抜けても残すには? | 抜けるときに数をDataStoreに保存し、入ったときに読み込む。Studioで試すには、作品をRobloxに保存して「StudioのAPIサービスへのアクセス」をオンにする |
| ツールボックスの「インベントリ」とはちがう? | ちがう。あちらは自分が作った・手に入れたモデルの一覧(日本語の画面では「持ち物」タブ)。7節で説明 |
今回の完成状態:下の画像のように、「持ち物」ボタンを押すと、拾ったりんご・石・水晶が個数つきのマスで並べば成功です。

1. 拾う物を置く
入れ物のフォルダーを作る
新しいBaseplateを開きます。エクスプローラの「Workspace」にマウスを乗せて、右に出る「+」を押し、一覧の検索欄に「Folder」と入れて「Folder」を押します。
入れたFolderをエクスプローラで選んだままF2キーを押して、名前を「Items」に変えます(赤い枠)。拾える物は、すべてこのItemsの中に入れます。スクリプトはItemsの中の物を全部、拾える物として扱います。

りんごを置く
エクスプローラの「Items」にマウスを乗せて、右に出る「+」を押し、一覧から「Part」を入れます。入れたPartをエクスプローラで選んだままF2キーを押して、名前を「Apple」に変えます。名前は英語の「Apple」のまま入れてください。スクリプトはこの名前で、何を拾ったかを見分けます。
続けてAppleのプロパティを次のように変えます。
| プロパティ | 値 |
|---|---|
| Shape | Ball |
| Size | 2, 2, 2 |
| Position(▼CFrameのすぐ下) | -6, 1, -12 |
| Color | 220, 40, 40 |
| Anchored | チェックを入れる |
どのプロパティも、Appleを選んだ状態でプロパティの検索欄に名前(「Shape」など)を入力して変えます。Shapeは右の「Block」を押すと形の一覧が開くので、「Ball」を押します。Size・Position・Colorは右の欄を押して数字を書きかえ、Enterキーを押します。Positionは「▼CFrame」のすぐ下のPositionに入れます。Anchoredは右の四角を押してチェックを入れます。
エクスプローラのItemsの中にAppleが入り(画像の1)、Shapeが「Ball」になって(画像の2)、スタートの台の手前に赤い玉が置かれます(画像の3)。

近づくと「拾う」と出るようにする
エクスプローラの「Apple」にマウスを乗せて、右に出る「+」を押します。一覧の検索欄に「ProximityPrompt」と入れ(画像の1)、一覧の「ProximityPrompt」を押します(画像の2)。

Appleの中に「ProximityPrompt」が入ります。ProximityPromptを選んだ状態で、プロパティの検索欄に「Text」と入力します。ActionTextは最初「Interact」、ObjectTextは空になっています。ActionTextの右の欄を押して「拾う」に書きかえ、Enterキーを押します。続けてObjectTextの右の欄を押して「りんご」と入れ、Enterキーを押します(赤い枠)。

石と水晶を複製で作る
エクスプローラで「Apple」を選んだ状態でCtrl + Dキーを押すと、同じ場所に複製ができ、複製したほうが選ばれた状態になります。そのままF2キーを押して、名前を「Stone」に変えます。
Stoneを選んだ状態で、プロパティを次のように変えます。どちらも、プロパティの検索欄に名前を入力し、右の欄を押して数字を書きかえてEnterキーを押します。Positionは、検索欄に入れると3つ並ぶうちの、いちばん上の「▼CFrame」のすぐ下のPositionです。
| プロパティ | 値 |
|---|---|
| Position(▼CFrameのすぐ下) | 0, 1, -12 |
| Color | 140, 140, 140 |
続けて、エクスプローラでStoneの左の「▶」を押して開き、中の「ProximityPrompt」を押して選びます。プロパティの検索欄に「ObjectText」と入れ、右の欄を「石」に書きかえてEnterキーを押します。
次に水晶を作ります。エクスプローラでもう一度「Apple」を押して選び、Ctrl + Dキーを押します。複製したほうが選ばれた状態になるので、そのままF2キーを押して、名前を「Crystal」に変えます。
Crystalを選んだ状態で、プロパティを次のように変えます。Positionは、Crystalを選んだ状態でプロパティの検索欄に「Position」と入力し、「▼CFrame」のすぐ下のPositionの右の欄を押して「6, 1, -12」と入れ、Enterキーを押します。Colorは、検索欄に「Color」と入力し、名前がちょうど「Color」の欄の右を押して「80, 200, 255」と入れ、Enterキーを押します。
| プロパティ | 値 |
|---|---|
| Position(▼CFrameのすぐ下) | 6, 1, -12 |
| Color | 80, 200, 255 |
| Material | Neon |
Materialは、Crystalを選んだ状態でプロパティの検索欄に「Material」と入力し、右の「Plastic」を押して開く一覧から「Neon」を押します。Neonにすると、水晶が光って見えます。
続けて、エクスプローラでCrystalの左の「▶」を押して開き、中の「ProximityPrompt」を押して選びます。プロパティの検索欄に「ObjectText」と入れ、右の欄を「水晶」に書きかえてEnterキーを押します。
エクスプローラのItemsの中にApple・Crystal・Stoneがそろい(画像の1)、CrystalのMaterialが「Neon」になって(画像の2)、赤・灰色・水色の3つの玉が並べば準備は完了です(画像の3)。

2. 拾った数を数えるスクリプトを書く
エクスプローラの「ServerScriptService」にマウスを乗せて、右に出る「+」を押し、一覧から「Script」を入れます。Scriptを入れると、3D画面のところにスクリプトの画面が開きます。
エクスプローラで、入れた「Script」を押して選び、F2キーを押して名前を「InventoryScript」に変えます(赤い枠)。

3D画面の上のタブ「InventoryScript」を押してスクリプトの画面に戻ります。中のコードを全部消して、次のコードを貼り付けます。
local Players = game:GetService("Players")
local ITEM_NAMES = {"Apple", "Stone", "Crystal"}
local RESPAWN_TIME = 5
-- 入ってきた人に、持ち物を数える入れ物を作る
Players.PlayerAdded:Connect(function(player)
local inventory = Instance.new("Folder")
inventory.Name = "Inventory"
for _, itemName in ITEM_NAMES do
local count = Instance.new("IntValue")
count.Name = itemName
count.Parent = inventory
end
inventory.Parent = player
end)
-- Items の中の物を拾えるようにする
for _, item in workspace:WaitForChild("Items"):GetChildren() do
local prompt = item:WaitForChild("ProximityPrompt")
prompt.Triggered:Connect(function(player)
local inventory = player:FindFirstChild("Inventory")
local count = inventory and inventory:FindFirstChild(item.Name)
if not count then
return
end
count.Value += 1
-- 拾った物は消して、RESPAWN_TIME 秒後に戻す
prompt.Enabled = false
item.Transparency = 1
task.wait(RESPAWN_TIME)
item.Transparency = 0
prompt.Enabled = true
end)
end
持ち物の数はどこに入る?
このスクリプトは、ゲームに入ってきた人ごとに「Inventory」というフォルダーを作り、その中に「Apple」「Stone」「Crystal」の3つのIntValue(整数を1つ入れておく部品)を入れます。最初はどれも0です。
| 部品 | 中身 | 拾ったとき |
|---|---|---|
| Inventory(Folder) | その人の持ち物をまとめる入れ物 | 変わらない |
| Apple(IntValue) | りんごの数 | りんごを拾うと1増える |
| Stone(IntValue) | 石の数 | 石を拾うと1増える |
| Crystal(IntValue) | 水晶の数 | 水晶を拾うと1増える |
拾ったときは item.Name(拾った玉の名前)と同じ名前のIntValueを探して1増やします。玉の名前を「Apple」などの英語にしたのは、この名前でつなぐためです。
数を増やすのは、プレイヤーのパソコン(クライアント)ではなく、サーバーのスクリプトです。サーバーで数えると、プレイヤーが自分のパソコンで数字を書きかえても、本当の数は変わりません。この考え方はRemoteEventの使い方でも解説しています。
そのほかの行の役目
| 行 | 役目 |
|---|---|
local ITEM_NAMES = {"Apple", "Stone", "Crystal"} | 数える物の名前の一覧。物の種類を増やすときはここに足す |
local RESPAWN_TIME = 5 | 拾った玉が戻るまでの秒数。RESPAWN_TIMEで決めた5秒たつと、同じ場所にまた出る |
prompt.Enabled = false と item.Transparency = 1 | 拾った玉を見えなくし、「拾う」も出ないようにする |
3. 持ち物の画面を作る
画面の入れ物と「持ち物」ボタン
エクスプローラの「StarterGui」にマウスを乗せて、右に出る「+」を押し、一覧から「ScreenGui」を入れます。入れたScreenGuiをエクスプローラで選んだままF2キーを押して、名前を「InventoryGui」に変えます。ScreenGuiは、テスト中の画面に重ねてボタンや文字を出すための入れ物です。
続けて、エクスプローラの「InventoryGui」にマウスを乗せて、右に出る「+」を押します。一覧の検索欄に「TextButton」と入れ(画像の1)、一覧の「TextButton」を押します(画像の2)。

入れたTextButtonを選んだままF2キーを押して、名前を「BagButton」に変えます。BagButtonのプロパティを次のように変えます。
| プロパティ | 値 | 最初の値 |
|---|---|---|
| Size | {0, 140},{0, 50} | {0, 200},{0, 50} |
| Position | {0, 20},{1, -70} | {0, 0},{0, 0} |
| Text | 持ち物 | Button |
| TextScaled | チェックを入れる | チェックなし |
SizeとPositionは、BagButtonを選んだ状態でプロパティの検索欄に名前を入力します。右の欄を押して全部消してから「{0, 140},{0, 50}」のようにかっこも入れてそのまま入力し、Enterキーを押します。Positionの「{1, -70}」は、ボタンの上の端を、画面の下の端から70ピクセル上に置くという意味です。どの大きさの画面でも、ボタンが左下に出ます。Textは右の欄を「持ち物」に書きかえてEnterキーを押し、TextScaledは右の四角を押してチェックを入れます。
エクスプローラのInventoryGuiの中にBagButtonが入り(画像の1)、TextScaledにチェックが入って(画像の2)、3D画面の左下に「持ち物」ボタンが出ます(画像の3)。

スクロールできる枠を入れる
エクスプローラの「InventoryGui」にマウスを乗せて、右に出る「+」を押し、一覧の検索欄に「ScrollingFrame」と入れて「ScrollingFrame」を押します。ScrollingFrameは、中身が多いときにマウスのホイールや指で上下に動かして見られる枠です。
入れたScrollingFrameを選んだままF2キーを押して、名前を「BagFrame」に変えます。BagFrameのプロパティを次のように変えます。
| プロパティ | 値 | 最初の値 |
|---|---|---|
| Size | {0, 280},{0, 200} | {0, 100},{0, 100} |
| Position | {0.5, -140},{0.5, -100} | {0, 0},{0, 0} |
| CanvasSize | {0, 0},{0, 0} | {0, 0},{2, 0} |
| AutomaticCanvasSize | Y | None |
| VerticalScrollBarInset | ScrollBar | None |
Size・Position・CanvasSizeは、BagFrameを選んだ状態でプロパティの検索欄に名前(「Size」など)を入力します。右の欄を押して全部消してから、表の値をかっこも入れてそのまま入力し、Enterキーを押します。Sizeの検索ではAbsoluteSizeなどほかの行も出るので、名前がちょうど「Size」の行に入れます。CanvasSizeも、左に「▶」の付いた「CanvasSize」の行の右の欄に入れます。
CanvasSizeは、枠の中で動かせる広さです。最初の「{2, 0}」は、枠の高さの2倍まで動かせるという意味で、中身が少なくても空白までスクロールできてしまいます。そこで0にして、AutomaticCanvasSizeを「Y」にします。Yにすると、中のマスが増えたぶんだけ、縦に動かせる広さが自動で広がります。AutomaticCanvasSizeは右の「None」を押して開く一覧から「Y」を押します。
Positionの「{0.5, -140},{0.5, -100}」は、画面のまん中から、枠の幅の半分(140)だけ左、高さの半分(100)だけ上という意味です。これで枠が画面のまん中に出ます。
エクスプローラのInventoryGuiの中にBagFrameが入り(画像の1)、AutomaticCanvasSizeが「Y」、CanvasSizeが「{0, 0},{0, 0}」になって(画像の2)、3D画面のまん中に白い枠が出ます(画像の3)。

VerticalScrollBarInsetは、プロパティの検索欄に「ScrollBarInset」と入力し、VerticalScrollBarInsetの右の「None」を押して開く一覧から「ScrollBar」を押します(赤い枠)。Noneのままだと、右のスクロールバーがマスの上に重なります。Robloxの公式の説明でも、Noneではスクロールバーの下に中身が少し隠れ、ScrollBarにするとバーの幅だけ中身が内側に入ると書かれています。

マスを自動で並べる部品を入れる
エクスプローラの「BagFrame」にマウスを乗せて、右に出る「+」を押します。一覧の検索欄に「UIGridLayout」と入れ(画像の1)、一覧の「UIGridLayout」を押します(画像の2)。

UIGridLayoutは、同じ枠の中に入れた画面の部品を、同じ大きさのマスにして左上から順に並べる部品です。横に入りきらなくなると、次の段に移ります。
UIGridLayoutを選んだ状態で、プロパティを次のように変えます。SortOrderは最初から「LayoutOrder」になっているので、そのままで大丈夫です。
| プロパティ | 値 | 最初の値 |
|---|---|---|
| CellSize | {0, 125},{0, 125} | {0, 100},{0, 100} |
| CellPadding | {0, 10},{0, 10} | {0, 5},{0, 5} |
CellSizeとCellPaddingは、UIGridLayoutを選んだ状態でプロパティの検索欄に名前を入力します。右の欄を押して全部消してから、表の値をかっこも入れてそのまま入力し、Enterキーを押します。
CellSizeは1マスの大きさ、CellPaddingはマスとマスのすき間です。幅280の枠から右のスクロールバーの幅を引いても、125のマス2つと10のすき間が入るので、横に2マスずつ並びます。
エクスプローラのBagFrameの中にUIGridLayoutが入り(画像の1)、CellPaddingとCellSizeが変わります(画像の2)。

一覧を作るスクリプトを入れる
エクスプローラの「InventoryGui」にマウスを乗せて、右に出る「+」を押し、一覧から「LocalScript」を入れます。LocalScriptは、プレイヤーのパソコンの中で動くスクリプトです(ローカルスクリプトとは)。
スクリプトの画面が開くので、エクスプローラで入れた「LocalScript」を押して選び、F2キーを押して名前を「InventoryUI」に変えます。
3D画面の上のタブ「InventoryUI」を押してスクリプトの画面に戻ります。中のコードを全部消して、次のコードを貼り付けます。
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local gui = script.Parent
local button = gui:WaitForChild("BagButton")
local bag = gui:WaitForChild("BagFrame")
local inventory = player:WaitForChild("Inventory")
-- 持ち物の表(並べる順・画面に出す名前・マスの色)
local ITEMS = {
{key = "Apple", name = "りんご", color = Color3.fromRGB(220, 40, 40)},
{key = "Stone", name = "石", color = Color3.fromRGB(140, 140, 140)},
{key = "Crystal", name = "水晶", color = Color3.fromRGB(80, 200, 255)},
}
-- 持っている物だけ、マスを作って並べ直す
local function refresh()
for _, child in bag:GetChildren() do
if child:IsA("Frame") then
child:Destroy()
end
end
for i, info in ITEMS do
local count = inventory:WaitForChild(info.key)
if count.Value > 0 then
local slot = Instance.new("Frame")
slot.LayoutOrder = i
slot.BackgroundColor3 = info.color
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundTransparency = 1
label.TextScaled = true
label.TextColor3 = Color3.new(1, 1, 1)
label.TextStrokeTransparency = 0
label.Text = info.name .. "\n×" .. count.Value
label.Parent = slot
slot.Parent = bag
end
end
end
for _, info in ITEMS do
inventory:WaitForChild(info.key).Changed:Connect(refresh)
end
refresh()
-- 「持ち物」ボタンで開く・閉じる
button.Activated:Connect(function()
bag.Visible = not bag.Visible
end)
最後に、持ち物の枠を最初は閉じておきます。3D画面の上の作品のタブ「Place1」を押して3D画面に戻り、エクスプローラで「BagFrame」を選んだ状態で、プロパティの検索欄に「Visible」と入力し、右の四角を押してチェックを外します。
エクスプローラのInventoryGuiの中にInventoryUIが入り(画像の1)、BagFrameのVisibleのチェックが外れます(画像の2)。3D画面の白い枠は、選んでいる間は線だけが見え、テストでは見えなくなります。

一覧のスクリプトの読み方
| 行 | 役目 |
|---|---|
local ITEMS = { ... } | マスに出す順番、画面に出す日本語の名前、マスの色の表。key はサーバーのIntValueの名前と同じにする |
refresh() の前半の Destroy() | 今あるマスをいったん全部消す。UIGridLayoutは消さないように、Frameだけを消している |
if count.Value > 0 then | 1つ以上持っている物だけマスを作る。持っていない物のマスは出ない |
slot.LayoutOrder = i | 表の順番(りんご→石→水晶)でマスを並べる。UIGridLayoutのSortOrderがLayoutOrderなので、この数の小さい順に並ぶ |
.Changed:Connect(refresh) | どれかの数が変わるたびに、一覧を作り直す |
bag.Visible = not bag.Visible | ボタンを押すたびに、枠の表示と非表示を入れかえる |
4. テストする
3D画面の上の作品のタブ「Place1」を押して3D画面に戻り、F5キーでテストを始めます(タブの名前はパソコンによって違います)。
W・A・S・Dキーで歩いて灰色の玉に近づくと、「E」「石」「拾う」と出ます(赤い枠)。

Eキーを押すと、石の玉が消えます。左下の「持ち物」ボタンを押すと(画像の1)、まん中に持ち物の枠が開き、「石 ×1」のマスが出ます(画像の2)。もう一度「持ち物」ボタンを押すと閉じます。消えた石の玉は、RESPAWN_TIMEで決めた5秒たつと同じ場所に戻ります。

続けて、りんごと水晶も拾い、戻ってきた石をもう一度拾ってから「持ち物」ボタンを押したテスト画面が下の画像です。りんご×1・石×2が上の段に、水晶が下の段に並びます(赤い枠)。3つ目のマスは枠に入りきらず、下が隠れています。右に、スクロールバーが出ています。

枠の上でマウスのホイールを手前に回すと、下にスクロールして「水晶 ×1」が見えます(赤い枠)。

数字を直接見て確かめる
テスト中のエクスプローラでも、数を確かめられます。エクスプローラの「Players」の左の「▶」を押して開き、自分の名前、その中の「Inventory」と順に開くと、Apple・Crystal・Stoneが並んでいます(画像の1)。Stoneを押して、プロパティの検索欄に「Value」と入力すると、拾った数(下の画像では2)が出ます(画像の2)。持ち物の画面とエクスプローラの数が同じなら、正しく動いています。

Shift + F5キーでテストを停止します。もう一度F5キーでテストを始めると、持ち物はすべて0に戻ります。次の節で、抜けても残るようにします。
5. 抜けても持ち物が残るように保存する
スクリプトを保存つきに差しかえる
エクスプローラの「InventoryScript」をダブルクリックしてスクリプトの画面を開き、中のコードを全部消して、次のコードを貼り付けます。2節のコードに、読み込みと保存の部分を足したものです。
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local store = DataStoreService:GetDataStore("Inventory")
local ITEM_NAMES = {"Apple", "Stone", "Crystal"}
local RESPAWN_TIME = 5
-- 入ってきた人に、持ち物を数える入れ物を作り、保存した数を読み込む
Players.PlayerAdded:Connect(function(player)
local inventory = Instance.new("Folder")
inventory.Name = "Inventory"
for _, itemName in ITEM_NAMES do
local count = Instance.new("IntValue")
count.Name = itemName
count.Parent = inventory
end
local ok, saved = pcall(function()
return store:GetAsync("Player_" .. player.UserId)
end)
if ok then
if saved then
for itemName, amount in saved do
local count = inventory:FindFirstChild(itemName)
if count then
count.Value = amount
end
end
end
player:SetAttribute("Loaded", true)
print("持ち物を読み込みました")
else
warn("持ち物を読み込めませんでした:", saved)
end
inventory.Parent = player
end)
-- 持ち物の数を保存する(読み込めなかった人は、0で上書きしないよう保存しない)
local function saveInventory(player)
local inventory = player:FindFirstChild("Inventory")
if not inventory or not player:GetAttribute("Loaded") then
return
end
local data = {}
for _, count in inventory:GetChildren() do
data[count.Name] = count.Value
end
local ok, err = pcall(function()
store:SetAsync("Player_" .. player.UserId, data)
end)
if ok then
print("持ち物を保存しました")
else
warn("持ち物を保存できませんでした:", err)
end
end
Players.PlayerRemoving:Connect(saveInventory)
game:BindToClose(function()
for _, player in Players:GetPlayers() do
saveInventory(player)
end
end)
-- Items の中の物を拾えるようにする
for _, item in workspace:WaitForChild("Items"):GetChildren() do
local prompt = item:WaitForChild("ProximityPrompt")
prompt.Triggered:Connect(function(player)
local inventory = player:FindFirstChild("Inventory")
local count = inventory and inventory:FindFirstChild(item.Name)
if not count then
return
end
count.Value += 1
-- 拾った物は消して、RESPAWN_TIME 秒後に戻す
prompt.Enabled = false
item.Transparency = 1
task.wait(RESPAWN_TIME)
item.Transparency = 0
prompt.Enabled = true
end)
end
保存するのは、{Apple = 1, Stone = 2, Crystal = 0} のように、名前と数を組にした表です。入ってきたときに読み込んだ表の数を、それぞれのIntValueに入れ直します。
player:SetAttribute("Loaded", true) は、読み込みがうまくいった人にだけ付ける目印です。読み込みに失敗した人の持ち物は0のままなので、そのまま保存すると、前に保存した数を0で上書きして消してしまいます。目印のない人は保存しないことで、それを防いでいます。
| 行 | 役目 |
|---|---|
DataStoreService:GetDataStore("Inventory") | 「Inventory」という名前の保存場所を使う |
store:GetAsync("Player_" .. player.UserId) | その人の番号(UserId)を目印に、保存した表を読み込む。何も保存していない人は空(nil)が返る |
store:SetAsync(...) | その人の番号を目印に、今の数の表を保存する |
pcall(function() ... end) | 読み込みや保存に失敗しても、スクリプト全体が止まらないようにする。成功したかどうかが ok に入る |
Players.PlayerRemoving | 1人がゲームを抜けるときに、その人の持ち物を保存する |
game:BindToClose | サーバーが閉じる前(テストの停止もふくむ)に、残っている全員の持ち物を保存する |
このままテストすると止まる
この時点でテストを始めるとどうなるか、確かめてみます。3D画面の上の作品のタブ「Place1」を押して3D画面に戻り、F5キーでテストを始めます。
出力に赤い文字で「You must publish this place to the web to access DataStore.」と出ます(赤い枠)。「DataStoreを使うには、この場所をWebに公開する必要があります」という意味です。InventoryScriptは4行目(GetDataStore)で止まり、その下の拾う仕組みまで進みません。玉に近づくと「E 拾う」は出ますが、Eキーを押しても玉は消えず、数も増えません。確かめたらShift + F5キーでテストを停止します。

作品をRobloxに保存する
画面の左上の「ファイル」を押し、一覧の「Robloxに保存」を押します。「バーチャル空間を保存」の画面が開きます。
名前の欄に作品の名前(下の画像では「Asobishift Inventory」)を入れます(画像の1)。チーム制作機能とデータ共有は、最初はオンになっています。どちらも右のスイッチを押してオフにします(画像の2)。データ共有は、作品のデータをRobloxの学習用に使ってよいかの切りかえです。チーム制作機能は友達と同時に作るとき(共同作業のやり方)に使う機能で、この記事の保存には関係ありません。右下の「保存」を押します(画像の3)。

「保存できました!」と出たら「閉じる」を押します。3D画面の上のタブの名前が、入れた作品の名前に変わります。保存した作品は非公開のままで、ほかの人が遊べる状態にはなりません。
StudioからDataStoreを使えるようにする
画面の左上の「ファイル」を押し、一覧の「バーチャル空間設定」を押します。左の「セキュリティ」を押し、「StudioのAPIサービスへのアクセスを有効化」の右のスイッチを押してオンにします(画像の1)。右下の「保存」を押します(画像の2)。

Robloxの公式の説明では、最初はStudioのテストからDataStoreを使えないので、この設定でオンにします。オンにすると、Studioのテストは遊んでいる人と同じ保存先を読み書きします。すでに遊ばれているゲームでオンにすると、テストで本物のデータを上書きするおそれがあります。そのため公式は、テスト用に別の作品を用意してオンにするよう勧めています。
保存されたか確かめる
3D画面の上の作品のタブ「Asobishift Inventory」(保存のときに入れた作品の名前)を押して3D画面に戻り、F5キーでテストを始めます。出力に「持ち物を読み込みました」と出ます。りんごと石を1つずつ拾ってから、Shift + F5キーでテストを停止します。出力に「持ち物を保存しました」と出れば保存できています(下の画像の1が読み込み、2が保存)。

もう一度F5キーでテストを始め、何も拾わずに「持ち物」ボタンを押します。前のテストで拾った「りんご ×1」「石 ×1」が残っていれば成功です(画像の1)。出力には、また「持ち物を読み込みました」と出ます(画像の2)。

以下は、アソビシフト編集部が2026年10月27日にStudioのテストで確かめた結果です。
| テスト | 出力 | 持ち物の画面 |
|---|---|---|
| Robloxに保存する前 | You must publish this place to the web to access DataStore. | 「E 拾う」は出るが、Eキーを押しても玉が消えず数も増えない |
| 保存とAPIのオンのあと、1回目 | 持ち物を読み込みました → (停止)持ち物を保存しました | りんご ×1・石 ×1(拾った分) |
| 2回目(何も拾わない) | 持ち物を読み込みました | りんご ×1・石 ×1(前の分が残った) |
Shift + F5キーでテストを停止します。
6. 持ち物の種類を増やすとき
種類を増やすときは、次の3か所に同じ英語の名前を足します。どれか1つでも名前がちがうと、拾っても数えられないか、画面に出ません。
| 場所 | 足すもの(例:葉っぱ「Leaf」) |
|---|---|
| WorkspaceのItemsの中 | Appleを複製して名前を「Leaf」にし、Positionを 12, 1, -12、Colorを 60, 180, 60 に変える。中のProximityPromptのObjectTextを「葉っぱ」にする |
InventoryScriptの ITEM_NAMES | {"Apple", "Stone", "Crystal", "Leaf"} |
InventoryUIの ITEMS | {key = "Leaf", name = "葉っぱ", color = Color3.fromRGB(60, 180, 60)}, の1行 |
例として、葉っぱ「Leaf」を足す手順を1つずつ書きます。
拾う物を置く
- エクスプローラの「Items」の中の「Apple」を押して選び、Ctrl + Dキーを押します。複製したほうが選ばれた状態になります(下の1枚目)
- そのままF2キーを押し、名前を「Leaf」に変えます(下の2枚目)
- Leafを選んだまま、プロパティの検索欄に「Position」と入力し、「▼CFrame」のすぐ下のPositionに「12, 1, -12」と入れてEnterキーを押します(下の3枚目)
- 検索欄に「Color」と入力し、名前がちょうど「Color」の欄の右を押して「60, 180, 60」と入れ、Enterキーを押します。BrickColorは「Sea green」になります(下の4枚目)
- エクスプローラでLeafの左の「▶」を押して開き、中の「ProximityPrompt」を押して選びます。プロパティの検索欄に「ObjectText」と入力し、右の欄を「葉っぱ」に書きかえてEnterキーを押します(下の5枚目)
数えるスクリプトに名前を足す
- エクスプローラの「ServerScriptService」の中の「InventoryScript」をダブルクリックして開きます
ITEM_NAMESの行の"Crystal"のすぐ後ろに, "Leaf"を足して、{"Apple", "Stone", "Crystal", "Leaf"}にします(赤い枠)

画面のスクリプトに1行足す
- エクスプローラの「StarterGui」の中の「InventoryGui」の左の「▶」を押して開き、中の「InventoryUI」をダブルクリックして開きます
ITEMSの中の、Crystalの行のすぐ下に、{key = "Leaf", name = "葉っぱ", color = Color3.fromRGB(60, 180, 60)},の1行を足します(赤い枠)

3D画面の上の作品のタブを押して3D画面に戻り、F5キーでテストを始めます。葉っぱに近づくと「葉っぱ」「拾う」の表示が出ます(下の1枚目)。Eキーで拾い、左下の「持ち物」ボタンを押して「葉っぱ ×1」のマスが出れば成功です(下の2枚目)。
以下は、アソビシフト編集部が試した結果です。手順1〜9のとおりに足してEキーで拾うと、「葉っぱ ×1」のマスが出ました。確かめ終わったら、Shift + F5キーでテストを停止します。
保存したデータに、あとから足した種類の数がなくても大丈夫です。読み込むときは保存されていた物の数だけを入れ直すので、新しい種類は0から始まります。
7. ロブロックスの「インベントリ」は3種類ある
ロブロックスで「インベントリ」「持ち物」と呼ばれるものは、3種類あります。この記事で作ったのは、3つ目の自作の持ち物です。
| 名前 | 何のこと | 作り方・開き方 |
|---|---|---|
| ツールボックスの「持ち物」タブ | Studioで、自分が作った・手に入れたモデルや画像の一覧 | 「ホーム」タブの右のほうの「ツールボックス」を押して開き、上の左から2つ目のアイコンのタブを押す。マウスを乗せると「持ち物」と出る |
| 標準のバックパック(Backpack) | 剣などのツール(Tool)を持つ、画面の下の数字キーの列 | StarterPackにToolを入れる(手に持てるアイテムの作り方) |
| 自作の持ち物 | 拾った物の数を数えて、自分で作った画面に出す | この記事の方法 |
ツールボックスの左から2つ目のアイコンのタブ(マウスを乗せると「持ち物」と出るタブ)を押すと(画像の1)、アソビシフト編集部が試した2026年10月27日には「ツールボックスの持ち物リストはまもなく廃止されます。新しいアセット管理を使用して持ち物リストを管理してください。」と出ました(画像の2)。案内のとおり、自分のモデルの一覧は新しいアセット管理へ移る予定です。

剣や道具のように、手に持って使う物を集めるゲームなら標準のバックパックが向いています。りんごや石のように、数を集めて交換や売り買いに使う物なら、この記事のように数で持たせるほうが、何十個でも画面がいっぱいになりません。
うまくいかないとき
| こまっていること | 見るところ | 直し方 |
|---|---|---|
| 近づいても「E 拾う」が出ない | ProximityPromptの場所 | 玉の中にProximityPromptが入っているか、玉がItemsの中にあるか確かめる |
| Eキーを押しても玉が消えず、数も増えない | 出力の赤い文字と、玉の名前 | 「You must publish…」と出ていたら、5節のRobloxに保存とAPIのオンを行う。赤い文字がなければ、玉の名前がITEM_NAMESの名前(Apple・Stone・Crystal)と同じか確かめる(名前が合わない玉は、消さずにそのまま残る) |
| 「持ち物」ボタンを押しても何も出ない | BagFrameの場所 | BagFrameがInventoryGuiの中にあるか、InventoryUIがInventoryGuiのすぐ下にあるか確かめる |
| 出力に「Infinite yield possible on 'Players.(名前):WaitForChild("Inventory")'」 | InventoryScript | サーバーのスクリプトが途中で止まっている。その上の赤い文字を先に直す(Infinite yield possibleの直し方) |
| マスが縦に1列しか並ばない | UIGridLayoutのCellSizeとBagFrameのSize | マス2つの幅とすき間(125 + 10 + 125 = 260)が、BagFrameの幅280からスクロールバーの幅(ScrollBarThickness、最初は12)を引いた268に収まるか確かめる |
| スクロールバーがマスに重なる | BagFrameのVerticalScrollBarInset | ScrollBarにする |
| 下の段のマスが見えないのにスクロールできない | BagFrameのAutomaticCanvasSize | Yにする |
| 抜けても持ち物が0に戻る | 出力 | 「持ち物を保存しました」が出ているか確かめる。出ていなければ、APIのスイッチがオンか確かめる |
よくある質問
ガチャで出た景品を持ち物に入れられる?
入れられます。ガチャの作り方の景品の名前を、この記事のITEM_NAMESと同じ英語の名前にし、ガチャのスクリプトで玉を出すかわりに、引いた人のInventoryの中の同じ名前のIntValueを1増やします。数え方と保存は、この記事のInventoryScriptがそのまま受け持ちます。
持ち物をショップで売れるようにするには?
ショップの作り方のように、ボタンを押したらRemoteEventでサーバーに伝え、サーバーのスクリプトでInventoryの数を1減らしてコインを増やします。数を減らすのも、必ずサーバーのスクリプトで行います。
次は、入力欄の言葉をフィルターしてから、みんなが見る看板に出します。次のステップ(上級 15/40)
次に知りたいことを選ぶ
- 次のステップ:入力欄の言葉をフィルターしてから、みんなが見る看板に出します → ロブロックス(Roblox)スタジオのテキストボックスの使い方
- 保存のしくみをくわしく知りたい → ロブロックス(Roblox)のDataStoreの使い方
- 持ち物をコインで買えるようにしたい → ロブロックス(Roblox)のショップの作り方
- 手に持って使えるアイテムも作りたい → ロブロックス(Roblox)スタジオで手に持てるアイテム(ツール)を作る方法






