Roblox Studioでゴールに紙吹雪を出す:ParticleEmitterの使い方
GoalPlatformへ触れたときだけピンクの紙吹雪風エフェクトを1回出し、約3秒で消えるゴール演出を作ろう。

黄色いGOALへ乗った瞬間だけ、ピンクの紙吹雪風エフェクトが上へ広がる。粒は約3秒で消え、誰もゴールしていない間は出続けない。完成までの目安は6分で、RobuxもPublishも必要ない。

この記事は、黄色いGoalPlatformを作る記事の続きだ。Course > GoalPlatformがあり、Playで上へ乗れる状態から始めよう。
1. 紙吹雪の出発点を作る
Stopした編集画面で、ExplorerのCourse > GoalPlatformを開く。GoalPlatformの右にある+からAttachmentを追加し、名前をConfettiPointへ変えよう。PropertiesのPositionは0, 0.7, 0にする。
次にConfettiPointの+からParticleEmitterを追加し、GoalConfettiへ名前を変える。Explorerが次の3段になれば配置は成功だ。
Course
└─ GoalPlatform
└─ ConfettiPoint (Attachment)
└─ GoalConfetti (ParticleEmitter)

Roblox公式のParticleEmitter解説では、Partへ直接入れる方法とAttachmentへ入れる方法がある。Attachmentへ入れると、その位置が粒の出発点になる。今回は黄色い台の中央より少し上から出すため、0, 0.7, 0にした。
Tip — Attachmentは演出の出発位置
Attachmentは、Partの中へ置く小さな目印だ。たとえばPositionを0, 0.7, 0にすると、GoalPlatformの中心より0.7 stud上から粒を出せる。
Tip — particleは3D空間へ飛ばす小さな画像
ParticleEmitterは、小さな2D画像を何枚も出して火、煙、きらめきなどを作る機能だ。今回は標準の星形画像をピンクにして、紙吹雪のようなゴール演出に使う。
2. 常時再生を止めて色と動きを決める
追加直後のGoalConfettiは自動で粒を出す。選択したままPropertiesを開き、まずEnabledをオフにしよう。

Enabledをオフにすると新しい粒の常時生成が止まる。あとでScriptからParticleEmitterのEmit()を呼び、必要な瞬間だけ指定個数を出す。
続けて次の値を入れよう。Colorは色の四角をクリックし、RGBを236, 72, 153にする。
| Property | 値 |
|---|---|
Enabled |
オフ |
Color |
236, 72, 153 |
Lifetime |
2.4, 3 |
Speed |
14, 20 |
SpreadAngle |
60, 60 |
EmissionDirection |
Top |
Acceleration |
0, -12, 0 |
Drag |
0.6 |
Size |
0.75 |
Transparency |
0.1 |
Rotation |
0, 360 |
RotSpeed |
-180, 180 |
LightEmission |
0 |
LightInfluence |
0 |
Lifetimeは1つの粒が残る秒数、Speedは最初に飛び出す速さだ。公式解説のとおり、2つの値には粒ごとの最小と最大を入れられる。今回は2.4〜3秒で少しずつ消える。
PropertiesでLifetimeやSpeedの左に小さな三角がある場合は開き、MinとMaxへ分けて入力する。1つの入力欄として表示された場合は、左の値へ2.4、右の値へ3のように入れれば同じ結果になる。値を入れた直後に粒が見えなくても問題ない。Enabledをオフにしているため、Play中にScriptがEmit()を呼ぶまで待機している状態だ。
Size = 0.75は星1つの大きさ、Transparency = 0.1は少しだけ透ける設定だ。Transparencyは0で完全に見え、1で見えなくなる。紙吹雪が大きすぎてキャラクターを隠す場合は、粒の個数を先に減らすのではなく、Sizeを0.5前後へ下げよう。動きの広がりは保ったまま見通しだけを改善できる。
EmissionDirection = Topで上向きに出し、Speedで飛び出す勢いを付ける。AccelerationのYがマイナスなので、その後は下へ向きが変わる。Dragは空気抵抗のように移動を少し弱める値だ。3つを組み合わせると、上へ飛んだあとに勢いが落ちて戻る動きになる。RotationとRotSpeedは粒ごとの最初の角度と回転速度をばらつかせる。どれか1つを極端に変えると画面外へ飛んだり、GoalPlatformの周りへ固まったりするため、まずは表の値で完成状態を作ろう。
Tip — SpreadAngleは上向きを中心に広げる角度
SpreadAngle = 60, 60なら、まっすぐ上だけでなく前後左右にも粒が飛ぶ。0, 0では細い一本の噴射に見えるため、紙吹雪では両方を60にしよう。
AccelerationのYを-12にすると、上へ飛んだ粒が下へ戻る。接触前から粒が見える場合は、ほかの値を直す前にEnabledがオフか確認しよう。
3. ゴール接触で70個だけ出す
ServerScriptServiceへScriptを追加し、GoalConfettiScriptへ名前を変える。中身を次のコードへ置き換えよう。
local Players = game:GetService("Players")
local goal = workspace:WaitForChild("Course"):WaitForChild("GoalPlatform")
local confetti = goal:WaitForChild("ConfettiPoint"):WaitForChild("GoalConfetti")
local cooldown = {}
local function onGoalTouched(hit)
local character = hit:FindFirstAncestorOfClass("Model")
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
local player = humanoid and Players:GetPlayerFromCharacter(character)
if not player or cooldown[player] then
return
end
cooldown[player] = true
confetti:Emit(70)
print("GOAL_CONFETTI_PASS", player.Name)
task.delay(2, function()
cooldown[player] = nil
end)
end
goal.Touched:Connect(onGoalTouched)
Players.PlayerRemoving:Connect(function(player)
cooldown[player] = nil
end)

Touchedは足だけでなく体のほかのPartでも続けて発生することがある。cooldown[player]がtrueの2秒間は同じプレイヤーの処理を重ねず、70個の噴射が何度も重なるのを防いでいる。クライアントから「ゴールした」と送らせず、サーバーが実際のGoalPlatform接触からPlayerを探す形だ。
処理の順番は、触れたPartから一番近いModelを探し、その中のHumanoidを確かめ、最後にPlayerへ変換する流れだ。落ちてきたコインや動くPartがGoalPlatformへ触れてもHumanoidがないため、紙吹雪は出ない。キャラクターだけを対象にできたらEmit(70)を1回呼び、2秒後に同じPlayerをもう一度受け付けられるようにする。
cooldownはゲームを止めるまでの短い記録で、Data Storeには保存しない。別のプレイヤーが同時にゴールした場合は、それぞれ別のPlayerをキーにするため、片方の2秒待ちがもう片方を止めることもない。ゴール演出は全員の画面で見えるので、複数人で競争するコースにもそのまま使える。
4. 接触前、発生、終了を確かめる
Playを押し、GoalPlatformの手前で3秒ほど止まろう。まだ粒が出なければEnabledオフが効いている。そのまま黄色いGOALへ歩いて乗る。

足がGoalPlatformへ触れるとピンクの粒が1回広がり、OutputへGOAL_CONFETTI_PASSと自分の名前が出る。約3秒待ち、粒がすべて消えて新しい粒が増えなければ、これで完成だ。
もう一度ゴールから降りて乗り直すと、2秒後なら再び1回だけ出る。乗った直後に細かく動いても噴射が重ならないことも確かめよう。
確認は「接触前」「接触直後」「3秒後」の3つを分ける。接触前に出ていればEnabled、接触しても出なければ親子関係か名前、3秒後も新しい粒が増え続ければEnabledまたは別のParticleEmitterを確認する。1つずつ状態を切り分けると、ColorやSpeedを何度も変えずに原因へたどり着ける。
粒が出たら、キャラクターと黄色いGOALの文字が同時に見える角度でもう一度試そう。ピンクの粒が画面全体を埋める場合はEmit(70)をEmit(40)へ下げる。演出が見えにくい場合は90へ増やす前に、Size、カメラとの距離、GoalPlatformの明るさを確認する。短い成功演出では、数を増やすよりゴールの近くへまとまって見えることが大切だ。
うまく動かないとき
- Play前から粒が出続ける: GoalConfettiの
Enabledをオフにする - ゴールへ乗っても何も出ない:
ConfettiPoint > GoalConfettiの親子関係と、Script内の3つの名前を確認する - 粒が下へ出る:
EmissionDirectionをTopにする - 1回で何度も出る:
cooldown[player] = trueとtask.delay(2, ...)を消していないか確認する - 赤いエラーが出る: Outputの最初の赤い行を読み、
Course、GoalPlatform、ConfettiPoint、GoalConfettiの大文字小文字を合わせる
完成
これで、ゴールへ触れた瞬間だけ70個の粒が広がり、約3秒で消える紙吹雪風エフェクトが完成した。EnabledをオフにしてEmit()で1回分だけ出す形は、宝箱、レベルアップ、ボタン成功などの短い演出にも使える。
