Roblox / Touched / leaderstats
Roblox Studioで触れたらポイントが増える仕組みを作る方法
Part に触れたプレイヤーだけへポイントを加算し、学習用のスコア体験を作ります。
Roblox では、公開に近い形の仕組みを小さく作って試せるのが強みです。 スコア加算はその代表例で、接触判定・プレイヤー判定・表示のつながりを一度に学べます。
自己紹介
オープニング対談
🎁このレッスンのおみやげ
- leaderstats と Score の最小構成
- Touched から player を見つける考え方
- サーバーで安全に加点する基本
- 連続接触を抑える簡単な debounce
Roblox では Workspace の Part + Script だけで反応を作り始められます。 体験の結果がすぐ見えるので、初心者の成功体験を作りやすいのが強みです。
1🎯何を作るのか
今回は、マップに置いた Part にプレイヤーが触れたら Score が 1 増える仕組みを作ります。 成功すると、プレイヤー一覧の横に Score が表示され、Part に入るたび数字が増えるようになります。
画面幅に応じて折り返します。横スクロールは不要です。
2🖼️完成イメージ
仕組みはシンプルですが、これが作れるとチェックポイント、コイン、ダメージ床など「ゲームらしい反応」の入口になります。
3🧠今回の理解ポイント
プレイヤー一覧へ自然に数字を出せるので、最初のスコア体験に向いています。
何でも反応するので、Humanoid と Player を絞り込む一手間が大事です。
スコアのような大事な値はサーバー側 Script で更新すると安心です。
debounce を最初から入れておくと、テストが楽で後から壊しにくくなります。
4🛠️Explorer の準備
今回は Script を2か所に分けます。役割を分けると、後から見直しても迷いにくくなります。
- 1Workspace に Part を置く
分かりやすいように名前を ScorePart にします。
- 2ServerScriptService を開く
leaderstats を作る Script の置き場所です。
- 3Script を2本作る
LeaderstatsSetup と ScorePart 側 Script を分けて作ります。
- 4Part の色を変える
触れる対象が見つけやすいように目立つ色にします。
5📈leaderstats を作る
まずはプレイヤーが参加したときに、Score を持てる状態を作ります。
game.Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local score = Instance.new("IntValue")
score.Name = "Score"
score.Value = 0
score.Parent = leaderstats
end)なぜ最初に leaderstats を作るの?
6⚡Touched で加点する
次に、ScorePart に付けた Script で Touched を受け、触れた相手がプレイヤーかどうかを確認してから加点します。
local part = script.Parent
local recentTouches = {}
local function resolvePlayer(hitPart)
local character = hitPart.Parent
if not character then
return nil
end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid then
return nil
end
return game.Players:GetPlayerFromCharacter(character)
end
part.Touched:Connect(function(hitPart)
local player = resolvePlayer(hitPart)
if not player then
return
end
if recentTouches[player.UserId] then
return
end
recentTouches[player.UserId] = true
local leaderstats = player:FindFirstChild("leaderstats")
local score = leaderstats and leaderstats:FindFirstChild("Score")
if score then
score.Value += 1
print(player.Name .. " scored! total = " .. score.Value)
end
task.delay(1, function()
recentTouches[player.UserId] = nil
end)
end)ここで大事なのは、hitPart からいきなり Score を増やさないことです。まず Humanoid を持つキャラクターか、 さらにそのキャラクターから Player を取れるか、順番に確かめていきます。
7✅動作確認
- 1Play で開始
まずプレイヤー一覧に Score が出るかを確認します。
- 2ScorePart に触れる
触れた瞬間に Score が 1 増えるか確認します。
- 3すぐ触り直す
debounce が効いて、連続で増えすぎないか見ます。
- 4Output を見る
print が出ると、サーバー側で動いていることも確認できます。
8🧯つまずきやすい点
- Score が表示されない: leaderstats の Folder 名が正しいか、Score の名前が一致しているかを見直します。
- 何度も一気に増える: debounce の解除時間が短すぎないか確認します。
- NPC でも加算される: Humanoid だけでなく Player まで取れているかを確認します。
- Script が動かない: LocalScript ではなく Script を使っているか見直します。
9📝まとめ
Roblox の接触ギミックは、leaderstats を作る → Touched を拾う → player を確定する → Score を増やすという流れで理解できます。 これができれば、コイン回収やチェックポイントにもつなげやすくなります。
10🚀次の一歩
- GUI ボタン入門でスコアを画面内にも見せる
- ClickDetector チュートリアルでクリック系の反応も学ぶ
- Roblox Studio の始め方記事で基礎を整理する
キャラ対談で総復習
クイズ
Q1. プレイヤー一覧の横に Score を表示したいとき、最初に用意する入れ物はどれですか?
クイズ
Q2. Part に触れた瞬間をサーバーで検知するイベントはどれですか?
クイズ
Q3. 同じ人が連続で触れたときに加点しすぎないようにするために、今回は何を入れていますか?