Roblox Studioでコインとスコアを作る方法|leaderstats入門

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形状にするとコインらしく見えます。

プロパティ設定例
ShapeCylinder
Anchoredtrue
CanCollidefalse
CanTouchtrue
Color黄色または金色
MaterialNeon

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`へ変更します。

動作確認

  1. Studio上部のPlayを押す
  2. 画面のプレイヤーリストへ`Coins`が表示されるか確認する
  3. コインへ触れる
  4. `Coins`が1増えるか確認する
  5. コインが消え、5秒後に戻るか確認する
  6. 2人テストでプレイヤーごとに数値が分かれているか確認する

StudioのTestタブから複数プレイヤーを起動すると、マルチプレイ時の動作も確認できます。

動かない場合の対処

Coinsが画面に表示されない

Folder名が`leaderstats`になっているか確認してください。
`Leaderstats`や`leaderStats`では標準ランキングに表示されません。

コインへ触れても増えない

次を確認します。

  1. Coinが`Coins` Folderの中にある
  2. Coinの`CanTouch`がtrue
  3. `CoinServer`がLocalScriptではなくScript
  4. Scriptが`ServerScriptService`にある

1枚で何度も増える

完成コードにある`busyCoins`の処理が削除されていないか確認してください。

コインが透明なまま戻らない

テスト中にコインを別のFolderへ移動したり削除したりすると、復帰処理が行われません。
編集はStopしてから行います。

次に起きる悩みと関連記事

コインの数を保存するには

現在の`Coins`はプレイヤーがゲームを終了すると0へ戻ります。
次回のプレイでも保持するにはDataStoreServiceを使います。

最初から取得・表示・保存を一度に実装すると、どこで失敗したか分かりにくくなります。
まずこの記事のコードだけでコインが増えることを確認してから、保存機能を追加してください。

改造してみよう

基本版が動いたら、次の変更に挑戦できます。

  1. 青いコインは5枚増える
  2. 取得時に効果音を鳴らす
  3. コインを回転させる
  4. コインをすべて集めたら扉を開く
  5. 制限時間内の獲得数を競う

コインごとに獲得数を変える場合は、Partへ`Value`というAttributeを追加し、
コード側で読み取る設計にすると管理しやすくなります。

まとめ

Robloxのコイン機能は、次の流れで作れます。

  1. Playerへ`leaderstats`と`Coins`を追加する
  2. コインの`Touched`でプレイヤーを特定する
  3. `Coins.Value`を増やす
  4. 連続取得を防いで一定時間後に再出現させる

次は、コインやアイテムへ近づいたときに「Eで拾う」と表示できる`ProximityPrompt`を使ってみましょう。

関連記事

参考資料

Roblox Creator Hub: In-experience leaderboards

Roblox Creator Hub: BasePart.Touched

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

現役のゲーム会社サーバーエンジニア。

HTML・CSS・JavaScript、PHP・MySQL、Robloxを使い、初心者でも実際に動かせるゲーム制作・プログラミング記事を執筆しています。

掲載コードは公開前に動作確認し、完成コードだけでなく「なぜ動くのか」「どこでつまずきやすいか」まで解説します。

Google Cloud Professional Cloud Architect取得。

コメント

コメントする

目次