roblox-vfx について
roblox-vfxは、Roblox開発者向けのパーティクルエフェクト制作・最適化スキルです。ParticleEmitterの外観、形状、フリップブックアニメーション、描画設定に加え、クライアント側の演出、距離カリング、性能計測、一時エミッターの後処理を扱います。
主な機能
- 01パーティクルの外観と動きの調整
- 02エミッター形状とフリップブック設定
- 03ライティングと描画効果の制御
- 04オーバードロー計測と性能最適化
- 05クライアント発生とエフェクト後処理
活用シーン
- 01環境パーティクルや単発バーストの作成
- 02モバイル向けパーティクル描画の最適化
- 03キャラクター部品やアニメーションイベントへの効果の連携
- 04遠距離エフェクトのカリングとエミッターの後処理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ nonlooped/ roblox-suite --skill roblox-vfxインストール後、Claude Code で/roblox-vfxを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/particle-emitter-properties.mdshapes-flipbooks-and-advanced.mdscripts/EffectBurst.lua詳細
roblox-vfx
主な資料: https://create.roblox.com/docs/en-us/effects/particle-emitters + ドキュメントの「Effects」セクションと「ParticleEmitter」クラスのリファレンス。
パーティクルの寿命、サイズ、透明度、発生率をまとめて調整します。透明なエフェクトが重なり合う場合は、対象となる最も性能の低いデバイスでプロファイリングします。
マーカーに反応するバーストについては、roblox-animationを参照してください。UI パーティクルについては、roblox-user-interfacesを参照してください。ParticleEmitter は ViewportFrame 内には描画されません。
作成と親の設定
- ParticleEmitter は BasePart(境界内、または選択した EmissionDirection の面から放出)または(制御しやすいため強く推奨)Attachment の子にします。
- 放出方向を調整するには、親または Attachment を回転させます。Attachment の子にした場合、EmissionDirection は無視されます。パーティクルの向きは Attachment 自体を回転させて調整します。
- EmissionDirection が有効なのは、パーツの子にした場合のみです。
パーティクルの見た目を調整する
- テクスチャ(アルファ付きの .png を推奨します。グレースケールにして LightEmission=1 を設定すると、暗い部分を隠せます)。
- 色(ColorSequence。Studio では、Color3 を 1 つだけ指定した場合も、1 つのキーポイントを持つ ColorSequence として保存されます。寿命に応じたグラデーションに使用します)。
- サイズ(NumberSequence。自然なばらつきを出すため、エンベロープを使うことがよくあります)。**警告:**サイズを大きくすると、GPU のフィルレートコストが高くなります。
- 透明度(NumberSequence)。パーティクルが突然表示・消失するのを防ぐため、フェードインまたはフェードアウトさせます。
- 寿命(またはパーティクルごとのランダム設定には NumberRange)。
- 発生率(1 秒あたりのパーティクル数。エミッターあたりの上限は、デスクトップで約 400、モバイルで約 100 です。低く保ち、ほかのプロパティで密度を調整します)。
続いて動きを調整します(発生時の Speed、SpreadAngle、重力や風に対する Acceleration、グローバル風が有効な場合の Drag と WindAffectsDrag、VelocityInheritance、LockedToPart、TimeScale)。
エミッターの形状
Shape = Box / Sphere / Cylinder / Disc。
- ShapeStyle = Volume(内部全体)または Surface(表面のみ)。
- ShapeInOut = Inward / Outward / InAndOut。
- ShapePartial で形状をさらに調整します。Cylinder:放出側の半径。Disc:内半径の割合(
0= 完全に閉じた円盤、1= 外周のみから放出)。Sphere:半球の角度(1= 球全体、0.5= 半球、0= 点)。
Sphere/Cylinder 形状は、エミッターを Attachment の子にすると正しく表示されません。BasePart の子にした場合にのみ使用してください(パーツは小さく、透明でもかまいません)。
フリップブック(パーティクルの寿命に応じて変化するアニメーションテクスチャ)
グリッドシート(2x2、4x4、8x8、Custom)を用意します。フレーム間に透明な余白を設けると、ミップフィルタリングで隣のフレームがサンプリングされるのを防げます。
- FlipbookLayout、FlipbookSizeX/Y。
- FlipbookFramerate(またはランダム範囲。最大 30)。
- FlipbookMode:Loop、OneShot(爆発向け。
FlipbookFramerateを無視し、パーティクルの Lifetime 全体で正確に 1 回再生します)、PingPong、Random(クロスフェード付き。有機的なばらつきを出すのに最適です)。 - FlipbookBlendFrames:Loop/OneShot/PingPong で隣接するフレームをクロスフェードし、アニメーションを滑らかにします。
- FlipbookStartRandom:各パーティクルをランダムなフレームから開始します(静止させながら見た目に変化をつけるため、フレームレートを 0 にすると便利です)。
**メモリに関する警告:**フリップブックは負荷が高くなります。テクスチャを再利用し、解像度を適切に保ち、メモリの少ないクライアントでは独自のアニメーション付きエミッターの数を制限してください(古いスマートフォンではフリップブックが自動的に無効になります)。
ライティングと描画の設定
- LightEmission:0 は通常、1 は加算合成/発光(暗いシーンでも機能します)。
- LightInfluence:0 = ワールドの光を無視、1 = 完全に影響を受ける。
- Brightness:
LightInfluenceが 0 の場合に、エミッターが加える光の強さを調整します。LightInfluenceが 1 の場合、効果はありません。 - Orientation:FacingCamera(従来型のビルボード)、FacingCameraWorldUp、VelocityParallel、VelocityPerpendicular。
- ZOffset:スタッド単位の描画レイヤーオフセット(3D 上で移動させずに、複数のエミッターを重ねます)。
デバイスごとのパフォーマンス
- 充填率(重なり合う透明レイヤーで覆われたピクセル数)とオーバードローが、主な GPU コストです。
- 率 × サイズ × 平均不透明度 × 画面上で重なり合う数 = コストです。
- Studio Editor Quality Level の最低と最高の両方で、必ずテストしてください。
- モバイルでは率の上限が低く設定されています。
- 一時停止するには .Enabled = false を使用します(既存のパーティクルは消えるか、:Clear() を呼び出すまで残ります)。
- 率が高く、サイズが大きく、透明度の高いエミッターを多数同時に使用すると、ローエンドのクライアントではエンジンによって処理が制限されたり、エフェクトが破棄されたりします。
- Studio で View → Stats → GPU → Fill Rate と Render → Overdraw を使ってオーバードローを測定してください。率を下げる前に、合計の不透明ピクセル領域を減らしてください。
レプリケーションとクライアント主導の放出
- ParticleEmitter の状態はレプリケーションされますが、個々のパーティクルはレプリケーションされません。サーバー所有のエミッターは、すべてのクライアントで同じパーティクルを自動的に生成します。
- 単発のバーストには、クライアント主導の放出を推奨します。サーバーがイベントを通知し、影響を受ける各クライアントがローカルでバーストを生成します。これにより、バーストごとのタイミングをネットワーク経由でレプリケーションする必要がなくなり、各クライアントの品質設定も尊重されます。
RemoteEvent:FireClientまたはローカルシグナルを使用して、クライアント側で一時的なビジュアルエフェクトを管理し、ゲームプレイのロジックはサーバー側で権威的に処理してください。
LOD と距離によるカリング
- カメラが遠い場合は、高コストのエミッターを停止するか、出力を減らしてください。一般的なしきい値は、100~300 studs で無効化し、距離が半分になったら Rate を半分にすることです。
workspace.CurrentCameraによる距離チェックまたはゾーンシステムを使用してください。多くのエミッターに対してフレームごとにMagnitudeを確認するのは避け、タグ付きのカリング用ハートビートまたは空間分割を使ってください。- 環境の天候や大勢の群衆では、エミッターを全体に生成するのではなく、カメラ周辺の領域だけに生成してください。
テクスチャのプリロード
- フリップブックアトラスや目立つエフェクトテクスチャは、必要になる前(ロード画面中や戦闘シーケンスの前など)に
ContentProvider:PreloadAsync({texture})を呼び出してプリロードしてください。これにより、ローエンドデバイスでバースト中にテクスチャが後から表示されるのを防げます。
パターン
- 継続的な環境エフェクト(炎、煙、雨):通常のカメラ距離で適切な密度に見えるよう、Rate、Lifetime、Size を調整します。
- 単発のバースト(爆発、衝撃、マズルフラッシュ):Rate を低くするか 0 に設定し、アニメーションマーカーまたはイベントから emitter:Emit(num) を呼び出します。
- アタッチするエフェクト(足元の砂ぼこり、武器の軌跡、オーラ):エミッターまたはそのアタッチメントを、動くパーツまたはボーンに親子付けします。適切に LockedToPart または VelocityInheritance を使用してください。
- 風に反応するエフェクト:環境内でグローバルな風を有効にし、エミッターで Drag > 0 と WindAffectsDrag = true を設定します。
- アニメーションとの連携:「FootStep」マーカー → 足の Attachment を見つける → Emit を呼び出すか、短い単発エミッターを再生します。
一般的なエフェクトに関する網羅的なプロパティリファレンス、視覚的な例、最適化チェックリスト、具体的なコードについては、references/ フォルダー(particle-emitter-properties.md、shapes-flipbooks-and-advanced.md)を参照してください(統合については SKILL とスキル横断メモで説明しています)。
関連するエフェクト(パーティクルと併用されることが多いもの)
- Beam:2 つの Attachment 間に描画するテクスチャ付きのリボン(レーザー、エネルギー、ロープなど)です。主なプロパティ:
Texture、TextureMode/TextureLength/TextureSpeed、Color、Transparency(ビームに沿った NumberSequence)、Width0/Width1、CurveSize0/CurveSize1、FaceCamera、LightEmission、LightInfluence、ZOffset。 - Trail:親パーツの移動に合わせて、2 つの Attachment の後ろに残るリボン(剣の軌跡、飛翔体の軌道、残像など)です。主なプロパティ:
Color、Transparency、Texture、TextureMode、TextureLength、MinLength、MaxLength、WidthScale、LightEmission、LightInfluence、FaceCamera、Lifetime。 - Highlight:低コストで効果的なアウトライン(選択、ターゲット指定、「パワーアップ」など)です。アウトラインと塗りつぶされた内部の両方を設定できます(
FillColor/FillTransparency、OutlineColor/OutlineTransparency)。DepthModeは、壁越しにハイライトを表示するか(AlwaysOnTop)、遮られていない場合にのみ表示するか(Occluded)を制御します。クライアント側では、同時に存在できるHighlightインスタンス数の上限は 255 です(無効化されたインスタンスも上限に数えられます)。 - 全体的な雰囲気を整え、パーティクルを適切に見せるには、PointLight / SpotLight / SurfaceLight、Atmosphere、PostProcessing を使用します。
一時的なエミッターのクリーンアップ
- 単発エミッターのクローンは、最大寿命が経過した後に必ず破棄してください(
Debris:AddItemまたはtask.delayを使用します)。無効化したエミッターインスタンスをワークスペース内に蓄積させないでください。 - アタッチされた継続的なエミッターは、再親化または破棄する前に
Enabled = falseに設定し、:Clear()を呼び出して、パーティクルが残らないようにしてください。 - エミッターをプールする場合は、再利用する前に Rate、Lifetime、Size、Transparency を既定値にリセットし、前の状態が次のバーストに引き継がれないようにしてください。
スクリプト
scripts/EffectBurst.lua:単発パーティクルバースト用のクローン作成・破棄ヘルパーです。テンプレートの Attachment/BasePart の下にあるすべての ParticleEmitter をクローンし、ローカルでバーストを発生させ、最大寿命の経過後にクリーンアップをスケジュールします。元のエミッターは変更されないため、継続的なエミッターにも安全に使用できます。
リファレンス索引
- particle-emitter-properties.md:パーティクルの外観、動き、発生、またはレンダリングコストを調整します。
- shapes-flipbooks-and-advanced.md:エミッターの形状、アニメーションテクスチャ、バースト、または距離によるカリングを設定します。