Roblox Studioでゲームらしい達成感を作るなら、最初に追加したいのがコインです。
この記事では、プレイヤーがコインへ触れると獲得数が増え、Roblox標準のプレイヤーリストへスコアが表示される仕組みを作ります。
この記事で解決できること
完成する機能は次の通りです。
- プレイヤーごとに`Coins`を用意する
- コインへ触れると1枚増える
- 取得したコインを一時的に非表示にする
- 5秒後に同じコインを再出現させる
- 1回の接触で何枚も増える問題を防ぐ
プレイヤーがコインへ触れるとコインが消え、プレイヤーリストの`Coins`が1増えます。取得されたコインは5秒後に同じ場所へ再出現します。
leaderstatsとは
Robloxには、プレイヤー名と一緒にスコアや通貨を表示する標準のランキング機能があります。
Playerの中へleaderstatsという名前のFolderを作り、その中へIntValueを入れると自動的に表示されます。
大文字や別の名前では認識されません。Folder名はすべて小文字でleaderstatsにしてください。
実装手順
コインを配置する
Explorerで次の構成を作ります。
Workspace
└─ Coins(Folder)
├─ Coin1(Part)
├─ Coin2(Part)
└─ Coin3(Part)
ServerScriptService
└─ CoinServer(Script)
`Coins` Folderの中へ、コインとして使うPartを複数配置します。
最初はCylinder形状にするとコインらしく見えます。
| プロパティ | 設定例 |
|---|---|
| Shape | Cylinder |
| Anchored | true |
| CanCollide | false |
| CanTouch | true |
| Color | 黄色または金色 |
| Material | Neon |
Cylinderが横向きになった場合は、Rotateツールで向きを調整してください。
完成コード
`ServerScriptService`へScriptを追加し、名前を`CoinServer`にします。以下のコードを貼り付けてください。
local Players = game:GetService("Players")
local coinsFolder = workspace:WaitForChild("Coins")
local RESPAWN_TIME = 5
local busyCoins = {}
local function getOrCreateCoins(player)
local leaderstats = player:FindFirstChild("leaderstats")
if not leaderstats then
leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
end
local coins = leaderstats:FindFirstChild("Coins")
if not coins then
coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Value = 0
coins.Parent = leaderstats
end
return coins
end
local function getPlayerFromHit(hit)
local character = hit:FindFirstAncestorOfClass("Model")
if not character then
return nil
end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid or humanoid.Health <= 0 then
return nil
end
return Players:GetPlayerFromCharacter(character)
end
local function collectCoin(coin, hit)
if busyCoins[coin] then
return
end
local player = getPlayerFromHit(hit)
if not player then
return
end
busyCoins[coin] = true
coin.CanTouch = false
coin.Transparency = 1
local coins = getOrCreateCoins(player)
coins.Value += 1
task.delay(RESPAWN_TIME, function()
if coin.Parent then
coin.Transparency = 0
coin.CanTouch = true
busyCoins[coin] = nil
end
end)
end
local function connectCoin(coin)
if not coin:IsA("BasePart") then
return
end
coin.Touched:Connect(function(hit)
collectCoin(coin, hit)
end)
end
local function setupPlayer(player)
getOrCreateCoins(player)
end
for _, coin in ipairs(coinsFolder:GetChildren()) do
connectCoin(coin)
end
coinsFolder.ChildAdded:Connect(connectCoin)
Players.PlayerAdded:Connect(setupPlayer)
for _, player in ipairs(Players:GetPlayers()) do
setupPlayer(player)
end
コードの仕組み
leaderstatsを作る
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
Playerの直下へ`leaderstats`を作ります。
さらに、その中へ整数を保存できる`IntValue`の`Coins`を追加しています。
触れた相手がプレイヤーか確認する
コインには、キャラクター以外のPartや落下物も触れます。
そこでHumanoidを持つModelか確認してから、`Players:GetPlayerFromCharacter()`でPlayerを取得します。
連続取得を防ぐ
キャラクターには足や腕など複数のPartがあります。
対策をしないと、1枚のコインへ触れただけで`Touched`が複数回発生する場合があります。
if busyCoins[coin] then
return
end
busyCoins[coin] = true
この処理で、再出現まで同じコインを取得できないようにしています。
コインを5秒後に戻す
task.delay(RESPAWN_TIME, function()
-- コインを再表示する
end)
`task.delay()`を使うと、ほかの処理を止めずに指定秒数後の処理を予約できます。
再出現を10秒にしたい場合は`RESPAWN_TIME = 10`へ変更します。
動作確認
- Studio上部のPlayを押す
- 画面のプレイヤーリストへ`Coins`が表示されるか確認する
- コインへ触れる
- `Coins`が1増えるか確認する
- コインが消え、5秒後に戻るか確認する
- 2人テストでプレイヤーごとに数値が分かれているか確認する
StudioのTestタブから複数プレイヤーを起動すると、マルチプレイ時の動作も確認できます。
動かない場合の対処
Coinsが画面に表示されない
Folder名が`leaderstats`になっているか確認してください。
`Leaderstats`や`leaderStats`では標準ランキングに表示されません。
コインへ触れても増えない
次を確認します。
- Coinが`Coins` Folderの中にある
- Coinの`CanTouch`がtrue
- `CoinServer`がLocalScriptではなくScript
- Scriptが`ServerScriptService`にある
1枚で何度も増える
完成コードにある`busyCoins`の処理が削除されていないか確認してください。
コインが透明なまま戻らない
テスト中にコインを別のFolderへ移動したり削除したりすると、復帰処理が行われません。
編集はStopしてから行います。
次に起きる悩みと関連記事
コインの数を保存するには
現在の`Coins`はプレイヤーがゲームを終了すると0へ戻ります。
次回のプレイでも保持するにはDataStoreServiceを使います。
最初から取得・表示・保存を一度に実装すると、どこで失敗したか分かりにくくなります。
まずこの記事のコードだけでコインが増えることを確認してから、保存機能を追加してください。
改造してみよう
基本版が動いたら、次の変更に挑戦できます。
- 青いコインは5枚増える
- 取得時に効果音を鳴らす
- コインを回転させる
- コインをすべて集めたら扉を開く
- 制限時間内の獲得数を競う
コインごとに獲得数を変える場合は、Partへ`Value`というAttributeを追加し、
コード側で読み取る設計にすると管理しやすくなります。
まとめ
Robloxのコイン機能は、次の流れで作れます。
- Playerへ`leaderstats`と`Coins`を追加する
- コインの`Touched`でプレイヤーを特定する
- `Coins.Value`を増やす
- 連続取得を防いで一定時間後に再出現させる
次は、コインやアイテムへ近づいたときに「Eで拾う」と表示できる`ProximityPrompt`を使ってみましょう。
関連記事




コメント