演出・エフェクト初級Robux不要

Roblox Studioでゴールに紙吹雪を出す:ParticleEmitterの使い方

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

公開日
黄色いゴールの上へピンクの紙吹雪風エフェクトが広がったRoblox画面

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

黄色いGoalPlatformへ乗るとピンクの紙吹雪風エフェクトが広がる完成状態

この記事は、黄色いGoalPlatformを作る記事の続きだ。Course > GoalPlatformがあり、Playで上へ乗れる状態から始めよう。

1. 紙吹雪の出発点を作る

Stopした編集画面で、ExplorerのCourse > GoalPlatformを開く。GoalPlatformの右にあるからAttachmentを追加し、名前をConfettiPointへ変えよう。PropertiesのPosition0, 0.7, 0にする。

次にConfettiPointからParticleEmitterを追加し、GoalConfettiへ名前を変える。Explorerが次の3段になれば配置は成功だ。

Course
└─ GoalPlatform
   └─ ConfettiPoint (Attachment)
      └─ GoalConfetti (ParticleEmitter)

GoalPlatformの中へConfettiPointとGoalConfettiを追加したExplorer

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をオフにしよう。

GoalConfettiのEnabledをオフにしたProperties

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でLifetimeSpeedの左に小さな三角がある場合は開き、MinMaxへ分けて入力する。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つを組み合わせると、上へ飛んだあとに勢いが落ちて戻る動きになる。RotationRotSpeedは粒ごとの最初の角度と回転速度をばらつかせる。どれか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)

GoalPlatformのTouchedからGoalConfettiのEmitを呼ぶGoalConfettiScript

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回広がって消える

足が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つの名前を確認する
  • 粒が下へ出る: EmissionDirectionTopにする
  • 1回で何度も出る: cooldown[player] = truetask.delay(2, ...)を消していないか確認する
  • 赤いエラーが出る: Outputの最初の赤い行を読み、CourseGoalPlatformConfettiPointGoalConfettiの大文字小文字を合わせる

完成

これで、ゴールへ触れた瞬間だけ70個の粒が広がり、約3秒で消える紙吹雪風エフェクトが完成した。EnabledをオフにしてEmit()で1回分だけ出す形は、宝箱、レベルアップ、ボタン成功などの短い演出にも使える。

公式リファレンス

画像の拡大表示