scenario-roblox-vfx-audio について
Roblox Studio 開発者向けの VFX・オーディオスキルです。データ駆動のテンプレートでエフェクトを作り、サーバー検証後にクライアントで再生し、測定でオーディオグラフを確認してから人が耳でミックスを評価します。
主な機能
- 01粒子、ビーム、トレイルのレイヤー構築
- 02サーバー検証後にクライアントへエフェクト配信
- 03エフェクト監査と時間別キャプチャ
- 04オーディオグラフ接続と可聴性の測定
- 05足音と音楽のダッキング設定
活用シーン
- 01複数プレイヤー向けのヒットや弾道エフェクト作成
- 02時間経過に沿ったエフェクトの見た目確認
- 03未接続または無音のオーディオグラフの調査
- 04素材別の足音設定と音楽ミックス
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-roblox-vfx-audioインストール後、Claude Code で/scenario-roblox-vfx-audioを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/copy-ready.mdcritique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/rbx_vfx_audio.pyscripts/agentkit/vfx-audio/AudioAudit.luauAudioKit.luauVfxAudit.luauVfxKit.luauscripts/agentkit/vfx-audio/runtime/Footsteps.luauFxReplicator.luau詳細
Roblox VFX とオーディオ
対象:macOS 上の Roblox Studio(2026年10月ビルド)。scenario-roblox-expert ツールキットを介して操作します。
熟練したエフェクトは一目で伝わり、すぐに視界から消えます。サーバーが判断して一度だけ放つレイヤー状のバーストを、各クライアントが描画します。熟練したオーディオは、誰かが聴く前に接続を確認し、測定した有線グラフです。エージェントはエフェクトをデータとして構築し、時間をかけて固定・キャプチャし、Wire.Connected、GetAudibilityFor、アナライザーでオーディオを確認します。ミックスの判断は人の耳に委ねます。ここで名前が挙がっている兄弟スキルが利用可能なスキルにない場合は、ユーザーにインストールを依頼してください(npx skills add scenario-labs/skills --skill <name>)。無人で作業する場合は、ツールのスキーマに基づいて進め、不足している点を明記してください。
必須の背景知識: scenario-roblox-expert(チャンネル、レビューの反復、ツールキット、現在の Roblox での落とし穴)。
状況(2026-10-19): Studio 0.743 で実施した17件のライブテストすべてに合格(MCP のタイムアウト後、再実行で2件に合格)。プレイテストを実施し、そのままコピーできるスクリプトも含まれています。5件のオフラインチェックすべてに合格(モジュールとすべてのスニペットで rbx_check のエラーは0件、フリップブックとオーディオファイルのチェック、Lune の円弧計算)。試聴は人に委ねられています。
熟練者の考え方(専門家との違い)
- 大きなスプライトを1つ使うのではなく、レイヤーを重ねて一度だけ放ちます。 5つ以上のテクスチャ(ホットスポット、暗い下地レイヤー)を重ね、
EmitCount属性の数だけ一度に放ちます(Twist VFX、zlKdwujvP2A [00:00:13-00:06:13]、MoldySugar、XXCGWREKpo0 [00:00:29])。バーストにはEmit、残る尾にはEnabledを使います(MoldySugar [00:04:16])。 - フラッシュの形が見分けられるなら、表示時間が長すぎます。 衝撃フラッシュの Lifetime は約0.05秒、斬撃レイヤーは0.2~0.3秒にします(Twist VFX [00:44:26, 00:00:13])。
- 速度方向に向くパーティクルの Speed は0.001~0.01にし、決して0にしません。 「速度が0だと、ただ消えてしまいます」(Twist VFX [00:00:13])。確認済み:Speed が0の
VelocityPerpendicularパーティクルは何も描画されず、0.01では描画されました。 - ビームの円弧は目測ではなく規則で作ります。 半円には、弦の長さの2/3を CurveSize に設定し、両端をふくらみ側に向け、FaceCamera を有効にします。セグメントは曲線の場合にのみ使います(Twist VFX [00:10:55, 00:56:19])。すると中点は半径上に位置します(Beam のドキュメントにあるベジェ曲線の説明。実機で検証済み)。
- サーバーが判断し、各クライアントが描画します。 ローカルエフェクトはそのクライアントでしか見えないため、衝撃エフェクトにはサーバーとそのレイキャストが必要です(Develuper、TkNZETIu0CM [00:02:15, 00:04:42])。サーバーの判断(名前、CFrame、または原点、速度、サーバー時刻)を近くのクライアントに送り、各クライアントでテンプレートを複製させます[追加]。サーバーはエフェクトのインスタンスを保持せず、クライアント側で距離に基づいて表示対象から除外します。
- 世界が無音なら、リスナーが設定されていません。 AudioListener も AudioDeviceOutput もなければ、何も聞こえません(Cookie Tech、FminS9nvqJg [00:14:59])。テンプレートのプレースでは
DefaultListenerLocationが Default のままで、プレイテストにもどちらもありませんでした(確認済み)。編集時に Camera を一度設定します。 - ホップごとに Wire を1本つなぎ、その後に検証します。 エフェクトが n 個なら、Wire は n + 1 本必要です(ByteBlox、LAYhd_j-thI [00:05:46]、Cookie Tech [00:19:35])。すべての
Wire.Connectedが true であること、またソースがAudioDeviceOutputに到達することをアサートします。ピン名が間違っていたり、循環があったりすると false になります(確認済み)。 - 足音は足に合わせます。 接地フレームで
leftまたはrightを指定したfootstepアニメーションイベントと、いくつかのマテリアルセットを使い、サウンドを1つループさせないようにします(GnomeCode、PNYtTkMidE8 [00:04:42, 00:08:23])。デフォルトの R15 アニメーションにはマーカーがなく、デフォルトのキャラクターサウンドは旧式のSoundです(確認済み)。歩幅ベースのフォールバックを用意し、Runningをミュートするか置き換えます。
最初に確認すること
- 各エフェクトを誰に見せるか: 詠唱者のみ(フィードバックとして即座に描画)か、周囲にいる全員か(サーバーで検証)。
- デバイス: モバイルでは各エミッターの上限が毎秒100パーティクルで、メモリ不足時にはフリップブックが破棄されます(パーティクルエミッターのドキュメント)。
- 参考資料: 見た目のクリップ。エキスパートはゼロからではなく、参考資料を基に作成します(Twist VFX [00:49:09])。
- オーディオスタック: 新規作業にはAudio APIを使用し、既存のゲームではレガシーの
Soundをそのまま使用します(非推奨ではありません。差分表の21行目)。ボイスチャットを有効にするかどうか。 - アセット: 組み込みの代替素材、またはアップロード済みIDを使用します。アップロードは人が行う手順です(Asset Managerを使用。WindowメニューまたはHomeタブから開けます)。エージェントはファイルの準備と確認を行います。
デフォルト:ReplicatedStorage.FxLibrary内のテンプレート、実行中のコピー用のworkspace.Fxフォルダー、DefaultListenerLocationはCamera、sync_runtimeで同期するAgentKitモジュール。
手順
キットを使わない場合(回答だけの場合、またはゲームに同梱しない場合)は、copy-ready.mdにあるスタンドアロンスクリプトを使用してください。レプリケーター、オーディオグラフ、マーカー式の足音、1プレイヤー向けポストエフェクト、Highlightによる被弾フラッシュ、ラグテストが含まれます。
- プレースをセットアップします。
VA.sync_runtime(studio)はVfxKit、AudioKit、FxReplicator、FootstepsをModuleScriptとして書き込みます。DefaultListenerLocationをCameraに設定します(リスナーのセットアップ)。GATE:モジュールが存在し、AudioAudit.audit(game)でno-listenerが報告されないこと。 - テンプレートをデータとして作成します。 エフェクトごとに
VfxKit.buildの仕様を1つ作成します。エミッター、ビーム、トレイル、ライト、サウンドの各レイヤーと、属性によるタイミングを設定します(テンプレート)。LightInfluenceとテクスチャを明示的に設定します。GATE:VfxAuditのエラーと警告がともに0件であること(監査)。 - 時間の経過に沿って確認します。
VA.timelineはTimeScaleを0にして、選択した時刻でエフェクトを固定し、それぞれをキャプチャします。コンタクトシートを開き、critique.mdを参考に評価します。GATE:image_checksに合格すること、連続するフレーム間に差があること、最初のフレームでシルエットが読み取れること、最後のフレームで何も残っていないこと。 - レプリケートします。
FxReplicator.serverはタイプ、クールダウン、範囲を検証してレイキャストを実行し、ブロードキャストします。FxReplicator.clientは再生とカリングを行います(レプリケーション)。プレイテストでのGATE:サーバーのworkspace.Fxの子要素が0件のままであること、クライアントのコピーがlifetime()後に0件に戻ること、連続送信と範囲外のリクエストが拒否されること、プレイのキャプチャで投射物とそのトレイルが確認できること。 - オーディオを接続します。 バスはAudioFaderから1つのAudioDeviceOutputに接続します。エフェクトは
AudioKit.chainで追加します。3Dソースは、Attachmentに配置したAudioEmitterです(オーディオグラフ)。GATE:すべての配線が接続されていること、AudioKit.pathsがAudioDeviceOutputに到達すること、IsPlayingとTimePositionが変化すること、アナライザーでレベルを読み取れること、GetAudibilityForが意図したカーブと一致すること。 - 動作を組み合わせます。 ヒット音の間はAudioCompressorの
Sidechainで音楽をダッキングします(ダッキング)。足音はマーカーまたは歩幅に基づいて再生します(足音)。GATE:dB単位で減衰量を測定すること、距離あたりの歩数と、床の素材ごとに設定された歩数を確認すること。 - 聴感確認を担当者に引き継ぎます。 人間にしか判断できない項目(critique.mdの耳で確認する項目)を、聴くべき場所とタイムスタンプを正確に示して列挙します。
数値
| 値 | 数値 | 対象、出典 |
|---|---|---|
| エミッターのレート上限 | 毎秒400回。モバイルでは毎秒100回 | エミッターごと(ドキュメント) |
| パーティクルの寿命上限 | 20秒 | エンジン(ドキュメント) |
| インパクトフラッシュ | 寿命は約0.05秒 | Twist VFX |
| スラッシュレイヤー | 寿命0.2~0.3秒、速度0.001~0.01 | Twist VFX |
| レイヤー間のZOffset | 0.001 | Twist VFX [00:02:24] |
| ビームの半円 | CurveSize = 弦の長さ x 2/3(弦の長さ20スタッドの場合:13.33、頂点10) | 弦の長さ(Twist VFX、実測) |
| 曲線ビームのセグメント数 | 最大約50。Instance.newでは10 | 曲率(Twist VFX、観察値) |
| ビームテクスチャの繰り返し | Stretch:TextureLengthの倍数。WrapとStatic:長さ / TextureLength | ビームの長さ(Beamsドキュメント) |
| フリップブックシート | 1024 x 1024。2x2、4x4、または8x8。最大30 fps | テクスチャごと(ドキュメント) |
| オーディオのインポート | 20 MB未満、7分未満、最大48 kHz。mp3、ogg、wav、flac | ファイルごと(ドキュメント) |
| AudioCompressor | Threshold -60~0 dB、Ratio 1~50、Attack 0.0001~0.5 s、Release 0.01~5 s | 参考値 |
| AudioFaderのVolume | 0~3 | 参考値 |
| デフォルトのエミッターのロールオフ | 距離に対して約4:30スタッドで0.133、90スタッドで0.044 | GetAudibilityFor(観察値) |
| 足音の歩幅 | 約4.4スタッド | WalkSpeed 16でのデフォルトのR15走行(観察値) |
| 足音の音量 | 草地で0.3、デフォルトで0.5 | 素材セットごと(GnomeCode [00:08:23]) |
| ダッキング開始 | Threshold -30 dB、Ratio 8、Attack 0.01 s、Release 0.3 s | [追加]。音楽で-21 dBを測定(テストL8) |
| ラウドネスの目標値 | 音楽:-16 LUFS、トゥルーピーク:-1.5 dB。一発音:ピーク-1.5 dBFS | [追加] |
品質ゲート
- 測定可能: VfxAuditとAudioAuditで問題がないこと。すべての
Wire.Connectedが接続済みであること。paths()が出力に到達すること。再生中のアナライザーのRmsLevelが0を上回ること。サーバーにエフェクトインスタンスが保持されていないこと。クライアントのコピーが0に戻ること。距離ごとの足音の回数。オーディオファイルがcheck_audioに合格し、シートがcheck_flipbookに合格すること。 - 視覚: Editでフリーズフレームのコンタクトシートを作成し、固定カメラで時間経過に伴う再生をキャプチャして、critique.mdに基づいて評価します。評価前にStudioのEditor Quality Levelを上げてください(File > Studio Settings > Rendering。MoldySugar、9dQR7FySSLg。gui-paths.md)。
- 聴覚(人間のみ): バランス、映像に対するタイミング、音色、繰り返しによる疲労、クリッピングを耳で確認します。
よくある間違い
| 間違い | 症状 | 修正 |
|---|---|---|
| 速度を重視するエミッターで Speed を 0 にする | パーティクルが表示されない | Speed を 0.001~0.01 にする |
| LightInfluence が 1 のときに明るさを上げる | 変化がない(観測:1 と 6 で同じ) | LightInfluence を 1 未満にする(TrendyV2、rIXyQ4RAwws [00:02:35]) |
| Instance.new でエミッターを作成する | LightInfluence が 0(観測)なのに対し、Studio から挿入すると 1(ドキュメント) | LightInfluence を明示的に設定する |
| Attachment が 1 つの Trail または Beam | 何も描画されない | Attachment0 と Attachment1 を設定する |
| エフェクトをサーバーでクローンする | エフェクトが二重になり、ネットワークコストが増加し、カリングされない | ブロードキャストし、クライアントでクローンする |
| Sound を SoundGroup の子にする | グループの音量が無視される | Sound.SoundGroup を設定する(ドキュメント) |
AudioPlayer.AssetId | 非推奨 | AudioPlayer.Asset |
| AudioEmitter を Folder または Model の下に置く | 音が出ない | Attachment、パーツ、または Camera の子にする |
| Listener を Default のままにする | 再生中に 3D オーディオが無音になる | DefaultListenerLocation を Camera にする |
MoveDirection から足音を生成する | Humanoid:MoveTo の使用中に足音が出ない(観測) | ルートの速度 |
組み込みの explosion01_smoke_main または fire_sparks_main を代用品として使う | レイヤーが見えない:テクスチャがほぼ黒い(観測) | smoke_main.dds、SquareParticle.png |
Edit で ModuleScript.Source を編集する | 古いコードが引き続き実行される(観測) | ModuleScript インスタンスを置き換える |
引き継ぎ
- scenario-game-assets と scenario-sprite-animation から: VFX テクスチャとフリップブックのフレーム
(2x2、4x4、または 8x8 のグリッド)。
make_flipbookでパッケージ化し、check_flipbookで確認してから、人がアップロードします。 - scenario-audio と scenario-elevenlabs から: 効果音、音楽、音声。
prepare_audio(トリミング、48 kHz、レベル調整)とcheck_audioを実行してから、人がアップロードします。 - scenario-roblox-animation から: アニメーションの
footstepおよびヒットフレームのマーカー。 - scenario-roblox-gameplay から: ヒットイベント、projectile id、origin、velocity。このスキルで描画します。
- scenario-roblox-networking との連携: エフェクトリクエストのリモート検証とレート制限。
- scenario-roblox-environment へ: アンビエント音と、照明エフェクトの参照先。照明のレシピはそちらにあります:暖色の光と寒色の影(aq0Fi0R2FAY [00:03:38])、Bloom Threshold は約 0.03(aq0Fi0R2FAY [00:07:37])。
- scenario-roblox-performance へ: フレーム予算に対する、シーンごとのエミッター、ビーム、フリップブックの数。
現在のRobloxに関するメモ
- Audio APIは2024-09-10以降、一般提供されています。
AudioPlayer.AssetはAssetIdに置き換わっています。AudioPlayerの内部音量は2025年に2倍になったため、以前のレベルを再確認してください(差分の21行目)。 - 参照するプロパティは
SoundService.DefaultListenerLocationです(プラグインのセキュリティ:Editで設定してください)。 FlipbookIncompatibleには「Particle texture must be 1024 by 1024 to use flipbooks.」と表示されます。レイアウトがNoneの場合や、アニメーションするシートでも表示されることが確認されています。これは状態ではなく、ヒントです。- パーティクルの
TextureContentに設定したEditableImageは何も描画しませんでしたが、同じ画像はDecalでは描画されました(確認済み)。プレビュー用シートはDecalに表示してください。 Lighting.Technologyは廃止されています。ライティングはscenario-roblox-environmentに属します。
参考資料
- references/procedures.md:ツールキットのAPI、および完全なコード、テスト、結果を含むすべての手順。
- references/expert-notes.md:専門家の判断、出典、タイムスタンプ。
- references/critique.md:キャプチャ、グラフ、人間の耳による確認の評価基準。
- references/gui-paths.md:同じ作業に使うStudioのメニューとパネル。
- references/copy-ready.md:キット不要の、単体で使えるスクリプト。わかりやすい名前を付けています。
- references/sources.md:URLと最適なタイムスタンプを含むすべての出典。
- scripts/rbx_vfx_audio.py:ランナー側のヘルパー(タイムライン、フリップブック、オーディオファイル)。
- scripts/agentkit/vfx-audio/:VfxKit、VfxAudit、AudioKit、AudioAudit、ランタイムのFxReplicatorとFootsteps。