scenario-unreal-vfx について
Unreal の Niagara エフェクトと Chaos 破壊表現向けのスキルです。パラメーター付きテンプレート、マテリアル、Dataflow レシピから、タイミング、視認性、性能評価まで扱います。キャプチャの採点とスレッド別計測で結果を確認します。
主な機能
- 01ゲームプレイのパラメーターに基づくエフェクト時系列の設計
- 02テンプレートと User パラメーター契約の利用
- 03Niagara Effect Type とスケーラビリティの設定
- 04Chaos 破壊レシピの作成と物理設定の確認
- 05キャプチャのレビューとスレッド性能の計測
活用シーン
- 01ダメージ範囲とヒット時刻に合ったエフェクト制作
- 02多数のエフェクトに対するプールと予算の設定
- 03調整可能な Chaos 破壊アセットの構築
- 04対象ハードウェアでの見た目と性能の評価
MCP 対応
README では、このスキルと MCP の関係について説明していません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-unreal-vfxインストール後、Claude Code で/scenario-unreal-vfxを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/ue_vfx.py詳細
Unreal VFX(Niagara、Chaos 破壊表現、VFX の批評)
エキスパートレベルとは、プレイヤーに真実を伝えるエフェクト(どこでダメージを受け、いつ終わったか)であり、ゲームプレイ上のクラスで許容されるコストをワールド全体で守り、対象のコア数でスレッドごとの数値を示し、明文化された評価基準に照らしてキャプチャを採点して実証されたものです。Python では Niagara のエミッターやモジュールを作成できません(5.8 API)。そのため、エージェントは User パラメーターの契約を定めたテンプレート、Material Instances、Effect Types、Dataflow のレシピを使用し、必要最小限のグラフ編集は正確な GUI 操作の依頼としてエスカレーションします。ここに記載された関連スキルが利用可能なスキルにない場合は、ユーザーにインストールを依頼してください(npx skills add scenario-labs/skills --skill <name>)。無人で作業する場合は、ツールのスキーマを基に進め、不足している点を明示してください。
必須の背景知識: scenario-unreal-expert(チャネル、レビューの反復、5.8 の落とし穴)。
ステータス(2026-09-24): Unreal はインストールされていません。オフラインチェックは成功します(python3 tests/code/unreal-vfx/run_all.py --offline)。エディター内のすべてのスニペットはまだ Unreal で実行されていません。job_00_vfx_probe.py が [verify] の名前を確認します。
スタンス(専門家から得られた重要な知見)
- ゲームプレイ上の真実を最優先します。 最も強い輪郭は衝突境界(ミサイルの先端、AoE の縁)に置き、ゲームプレイ上の数値(
User.Radius= ダメージ半径)を読み取ります。手動で合わせた定数は決して使いません。残り続ける表現は「まだ危険だ」と伝えます(Keyser #1 [00:09:44], [00:15:21])。 - コントラストは画面上の予算です。 コアは白に近づけますが、純白にはしません。周縁は高彩度にし、暗く彩度の高いハローを付けます。コントラストは先端で最大にします。弱い飛翔体には、軌跡を明るくするのではなく、より高温に見えるコアと暗いウィスプを使います(Keyser #3 [00:08:13], [00:12:03]; #4 [00:19:55])。予期しない白さは、加算合成の重複が積み重なっていることがほとんどです。色を調整する前にスポーン数を数え、その後、加算合成のコアをアルファブレンドした高彩度のレイヤーで補います(Shishido [00:17:42]-[00:18:14])。
- タイミングが物語を伝えます。 予備動作はキャラクターの詠唱アニメーションに合わせます(その時間がない場合は、減衰に見どころを持たせます)。ビルドアップは着弾と同時にスポーンを停止し、フラッシュは着弾フレームで最大になります(「強度はサイズではありません」)。結果は原因の後に続きます(フラッシュ、次に破片と火花、その後に煙)。消散はビルドアップより短くし、ゲームプレイの有効時間内に終わらせます。速い弾丸状の先端はストロボのように見えるため、速度方向に引き伸ばし、モーションブラーをテクスチャに焼き込みます(Keyser #5 [00:08:13]-[00:09:54], [00:14:34], [00:18:07]; #2 [00:03:31]; Shishido [00:30:00], [00:37:02])。
- エフェクトではなく、ワールドを最適化します。 まずすべてのシステムに Effect Type を設定します。Lyra では、見た目を変えずにアクティブなシステムが 227 から 103 に減り、RT は 5.07 ms から 1.51 ms になりました(Kiraly [00:20:48])。Effect Type はエミッターごとではなく、システムごとに設定します。セカンダリエミッターには Scalability Mode Self を設定します。ターゲットのコア数で GT、GT Concurrent、RT を個別に確認し [00:05:15]、該当スレッドの負荷を軽減する手段を選びます。距離によるカリングはレンダリングではなくティックを停止しますが、チェックにはスケーラビリティマネージャーの処理コストがかかります。カリングプロキシはティックを節約しますが、RT は節約しません [00:16:57], [00:18:02]。GPU システムは、見えていなくてもすべて RT ディスパッチのコストがかかります [00:05:47]。FX 予算は重要度の低いタイプにのみ適用し、振動を抑えるために
fx.Budget.AdjustedUsageDecayRateを使用します [00:36:50]-[00:37:21]。 - クラスと発生頻度に応じてスポーンの構成を選びます(Kiraly の表 [00:45:57])。中程度のワンショットにはプールを使います(Manual Release は Release to Pool を意味します)。大量発生には Data Channel リスナーを使います。単純なバーストには、システム状態をオフにしたステートレスエミッターを使います(足音の GT が 1,387 us から 271 us に減少 [00:39:24])。NDC とステートレスは併用できません。少量なら CPU に残します。
- 破壊のコストは、アクティブなボディ数と接触数で決まります。 次の順で対処します。レンダリング(GC に Nanite を適用し、ISM レンダラーを使ったルートプロキシを設定)、ボディ数と寿命(クラスター、ランダムタイマーと Cluster Crumbling を併用した Remove on Break、プラットフォームごとの削除倍率、Tiny Geo)、コリジョン(片方向の破片、クラスターごとに凸形状を 1 つ、相対サイズ 0.3 未満のボックス)、スロットリングは最後に行います(Caillaud wPgd1J1Tf70 [00:03:47]-[00:16:18]; Xiao Yue zFiHDRREv7E [00:29:27])。
- 武器はフィールドではなく、ひずみで壁を破壊します。 External Strain と Apply Breaking Linear Velocity を適用し、飛翔体の速度に応じてスケーリングします。ひずみの減衰は設定しません。フィールドは「重く、遅い」ものです(Van Allen [00:29:29])。ダメージモデルは 1 つ選びます。Material Strength and Connectivity(物理マテリアルの引張強度を調整)か、レベルごとの閾値(配列を調整)です。サイズ別設定はフラグであり、モデルではありません(Xiao Yue [00:19:54]-[00:20:27])。重量感は摩擦(Max を選択)と低い反発係数から生まれます。石の密度は 2 g/cm3 です。2000 は単位の誤りです(Van Allen [00:26:11])。
- クリックではなく、レシピを使います。 パラメーターを公開したテンプレートと、アセットごとの変数を備えた Dataflow グラフは、アートの変更にも対応し、エージェントが確実に扱えるものです(Caillaud t_jyTILDYo8 [00:02:46])。
最初に確認すること
| 入力 | 計画が変わる理由 | 指定がない場合のデフォルト |
|---|---|---|
| プラットフォーム、フレームレート、最低仕様のコア数 | スレッドごとの予算、品質テーブル | PC 60 fps;コア数は scenario-unreal-performance に基づき、不明な場合は 4(Kiraly) |
| ゲームプレイの数値(scenario-unreal-gameplay) | 半径、速度、ダメージウィンドウ、発射速度、同時発生数の上限、詠唱アニメーションのタイミング | 確認する;半径は決して推測しない |
| カメラと環境 | 実際の地面の色を背景に、ゲームプレイ時の距離から読み取る | ゲームのカメラとレベル |
| スタイルの柱、重要度ティア | 明るさの予算:待機、基本、防御、ダメージ、ゲームチェンジャー、アルティメット(Keyser #1 [00:13:08]) | アートリードが定める 3 つの柱 |
| 群衆と破壊の範囲 | 画面上の複製数;レベルごとの壁の数、破壊必須のオブジェクト、ローエンドのプラットフォーム | 現実的な最悪の戦闘;リアルタイム、Nanite を有効化 |
| 予算 | エフェクトごとの ms を示す情報源はない | [追加] すべての Niagara を、最低仕様で約 2 ms GT + GT Concurrent 以下、かつ 1.5 ms RT 以下にする;scenario-unreal-performance で確認 |
ワークフロー
-
エンジンごとに 1 回プローブします。
job_00_vfx_probe.py(ヘッドレス)。ゲート:probe.jsonが[verify]項目に回答していること。 -
要素を分類し、システムにグループ化します。 要素ごとに
classify_elementを実行し、その後system_planを実行します。システムごとに 1 つの Effect Type(最も重要な要素のもの)を設定し、残りは Scalability Mode Self にするか、スパムのように発生する場合、または GPU 上で動作する場合は、独自のシステムにします。システム(例) Effect Type 重要なエミッター 二次要素(Scalability Mode Self) Projectile、beam、tracer NET_OneShotCritical head trail、wisps、embers Impact、hit、muzzle flash NET_OneShotCritical flash、damage ring smoke、sparks(スパムのように発生する場合、または GPU 上で動作する場合は分割) Debris または impact listener(NDC) NET_OneShot、decay damping がある場合のみ予算対象 なし すべて AoE、status、pickup NET_PersistentCritical rim interior flavor 環境の dust、leaves、rain NET_Ambient なし すべて ゲート:
system_planにエラーがないこと。 -
作成前にタイミングを計画します。 スポーンスケジュール(キャストアニメーションからの予備動作、ヒットに向けた立ち上がり、ヒット時のフラッシュ、破片と火花、煙、終了時間)を記述し、
spawn_schedule_verdictを実行します。strobe_risk(speed, head length)で、高速な先端に必要な伸長を確認します。 GATE:エラーがなく、伸長がテンプレート仕様に含まれていること。 -
テンプレートと契約。
duplicate_template、user_parameters、contract_verdictを実行します。制御項目が不足している場合は、GUI でリクエストを 1 件作成します。そのリクエスト内のカーブは、fade_curve_verdict(寿命の中盤から不透明度がフェードし、縮小のみにならないこと)とflipbook_playback_verdict(速く再生してから遅くすること)に合格する必要があります。 GATE:契約が OK であること。 -
見た目:マテリアルとテクスチャ。 scenario-unreal-materials のマスターマテリアルとインスタンス(エロージョン、グラデーションマップ LUT、デプスフェード)を使用します。まずテクスチャを再利用し(Trümpler [00:16:33])、グロー、LUT、ノイズは Python で生成します。マスクは sRGB をオフにして
TEXTUREGROUP_Effectsでインポートし、大きなソースは Maximum Texture Size で上限を設定します。ベイク済みフリップブックはプリマルチプライドされているため、マテリアルで RGB を A で割る必要があります(premultiplied_check)。煙と炎には、デフォルトでベイク済みフリップブックを使用します。Fluids は Beta です。 GATE:audit_vfx_texturesとflipbook_checkに問題がないこと。 -
システムプロパティとスケーラビリティ。
set_system_propertiesを使用します。effect_type、max_pool_sizeは該当タイプのシステム上限に設定し、再生途中でのロードに備えて prime を 0 に、warmup を 0 に設定します。静的エフェクトでは current-frame data をオフにします。ワールド空間のトレイルには、速度 x 寿命に基づく固定範囲が必要です(fixed_bounds_check)。EFFECT_TYPE_PRESETSの Effect Types を使用します(create_effect_type[verify] または GUI で一度設定)。 GATE:audit_niagaraにNO_EFFECT_TYPEがなく、caps_verdictとbudget_verdictに問題がないこと。 -
ゲームプレイに接続します。 scenario-unreal-gameplay では、プーリング方式でスポーンし、ゲームプレイデータから User パラメーターを設定し、キャストアニメーションから予備動作をスポーンし、Data Channel ペイロードを書き込み、ヒット時にひずみを適用します(
strain_plan。必ず壊す必要があるオブジェクトでは、衝突とひずみの両方を使用します)。ヒット時にトレイルを無効化し、パーティクルが消えるまで再生させます [added]。 GATE:PIE でヒットすると、プールからスポーンされること(FX Outliner の InUse / FreeInPool)。 -
破壊可能アセット。 水密で、自己交差のないソース(
mesh_watertight_check)を使用します。シードを固定します。マテリアルに応じたパターン(コンクリートはノイズと目地、木材は収縮・破壊・伸長、ガラスはスライスまたはクラックマテリアル)にします。2〜3 階層にし、アンカーを設定します。面積しきい値を指定した Proximity グラフを使用します。ダメージモデルは 1 つにします。クラスターごとに凸形状を 1 つ使用します。距離から表面までのベイクを含む内側マテリアルを使用します(Caillaud t_jy [00:29:14])。Remove on Break の範囲と Cluster Crumbling を設定し、ローエンドデバイスのプロファイルでは削除倍率を設定します。安定後に起き上がらない破片は無効化します(Xiao Yue [00:28:45])。破壊時の VFX には、Project Settings での Chaos データ生成と、コンポーネントでの破壊通知が必要です(enable_break_events、Xiao Yue [00:08:42])。破壊されたボーンのみをデブリプロファイルに切り替えます。その後harden_gcを実行し、ジム環境でピース数を 10、50、100 として確認します(Caillaud t_jy [00:35:12])。 GATE:gc_recipe_verdict、gc_verdict、physmat_checkに問題がないこと。 -
レビューループ。 テクスチャ付きのレビュー用レベル、Manual exposure、ゲームプレイカメラを使用します。クリーンプレートで
live_capture_series.pyまたはcapture_agesを実行し、score_captures.pyで確認します(空白フレームがあるとシリーズは無効になります)。色、グレースケール、目を細めたときのシートを確認します。PIE で繰り返し(「ビューポートは嘘をつく」、Shishido [00:05:05])、色覚特性の確認として緑と茶色の地面の上で、群衆グリッド内で、さらにsg.EffectsQualityを 0〜3 にして確認します。白飛びが起きたら、まず Debugger のカウントに対してduplicate_spawn_checkを実行します。1 回のパスにつき変更は 1 つにします。 GATE:ルーブリックに不合格がなく、評価項目の行にスコアが付いていること(references/critique.md)。 -
計測します。 目標コア数で、最も負荷の高い戦闘を固定して計測します。
stat unit、stat NiagaraOverview、Debug HUD、-statnamedeventsを指定した Insights を使用します(これを指定しないと Niagara は表示されません。Kiraly [00:10:52])。init_for_performance_baseline()を実行し、変更の前に毎回lever_checkを実行します。予算機能が有効な場合はbudget_oscillationを実行します。破壊については、破壊前後のフレームシリーズ、CVD、t.OverrideFPS 60[verify] を使用します。 GATE:niagara_overview_verdict、before_after、destruction_run_verdictが予算内で、見た目が同等であること。 -
提出 予算シートを scenario-unreal-performance に渡します。
数値
| 値 | 関連項目 | 出典 |
|---|---|---|
| NET_OneShot:システムあたり15、タイプあたり約30、スポーンのみ、破棄してクリア、即時カリング0.0 | 一度限りの処理、重要ではない | Kiraly [00:22:26] |
| NET_PickupPersistent:5(視線)、継続、スリープ状態、カリング遅延1.0 s | 永続的、重要 | Kiraly [00:24:03] |
| プールの最大サイズ32、事前確保0(デフォルト);タイプ上限=プールサイズ | システムあたり | Kiraly [00:32:18]、[00:33:22] |
| 1024上のフリップブック8 x 8=128 pxタイル、最終フレーム63、30 fpsでベイク | ベイカー | Flipbook Baker doc |
| しきい値5000 / 500 / 50;ひずみ50000、半径100、速度500 | クイックスタートの壁 | Chaos docs |
| 相対サイズ0.3未満のボックス;4レベルに4,000個の破片、約200個のボディにヒット | リーフプロキシ;クラスタリング | Xiao Yue [00:25:51]、[00:22:32] |
| スリープ時に3 sで削除;5~10 s後に削除し、その後プラットフォームごとの倍率を適用 | デブリ | Caillaud [00:10:43]、[00:11:24] |
品質ゲート
- 測定可能: 監査(
audit_niagara、audit_gc、audit_vfx_textures、caps_verdict、system_plan、gc_recipe_verdict);目標コア数でのスレッドごとの統計、平均値とスパイク;破壊時のスパイクと復旧;キャプチャ評価基準(フットプリントと半径、値の範囲、白飛び、値の低下に伴う彩度、焦点にアクセントを置いた60 / 30 / 10、時間経過後も維持されるサイズ分類、頭部のコントラスト、色覚多様性に配慮したコントラスト、強度カーブ、スケジュール、ストロボ);image_checksで空白のフレームを拒否します。 - 視覚: ゲームプレイ時の距離でのグレースケールの見え方;ポップコーニング;ストーリー上の節目;群衆の見え方;品質レベルをまたいでポップがないこと;破壊時に厚みのある内部を持つ素材として認識できること、浮遊する破片がないこと、重量感のあるデブリ、粉じんで隠された除去。
よくある間違い
| 間違い | 状況 | 修正方法 |
|---|---|---|
| 半径を手動で合わせる | ダメージ範囲よりリングが大きい | ゲームプレイから User.Radius を取得 |
| 白飛び | 平坦な白い塊 | 重複数を数え、加算コアの後ろにアルファブレンドした彩度の高いレイヤーを配置 |
| 高速移動時に頭部が丸い | 点滅する点 | 速度方向に伸ばし、テクスチャにモーションブラーを加える |
| ヒット後に蓄積し、フラッシュ前に煙が出る | 効果がぼやける | 生成スケジュール:ヒット時に停止し、原因となる効果を先に発生させる |
| 縮小だけでフェードさせる | カードがちらつく | ライフタイムの中盤から不透明度をフェードさせ、レイヤーの色を一致させる |
| エミッターごとに Effect Type を設定 | 残り火にカリングされないタイプが適用される | システムごとに 1 つのタイプを設定し、Scalability Mode Self にする |
| RT を削減するために距離カリングを行う | RT が変わらない | lever_check:上限、CPU シミュレーション、ステートレス |
| 減衰なしで予算を設定する | カリング、再生成、カリング | 減衰率を設定し、非クリティカルなタイプのみを対象にする |
| 固定バウンドがトレイルより小さい | トレイルが画面上で消える | fixed_bounds_check |
| 衝突時に投射物を破棄する | トレイルが途切れる | 無効化し、パーティクルが消えるまで待つ |
| 壁に固定するためにスリープさせる | 少しぶつかると再び動き出す | アンカーまたはキネマティックボーンを使う |
| デフォルトの接続グラフ | チャンクが浮く、角がヒンジになる | Proximity または Bounds Overlap Filtered を使う |
| 調整済みのしきい値配列を使った MSC | 調整しても何も変わらない | 物理マテリアルで引張強度を設定する |
| 弾丸ごとにフィールドまたはひずみのフォールオフを設定する | 物理演算が急増する | ひずみと破壊速度を使い、フォールオフは設定しない |
| GC 全体にデブリプロファイルを設定する | 壊れていない壁をプレイヤーが通り抜ける | 破壊イベントで破損したボーンに切り替える |
| スリープ状態のデブリが起きない | ソルバーの負荷がかかる | 無効にする |
gc.removal_duration = ... | 拒否される(読み取り専用属性) | set_editor_property |
ハンドオフ
- 受け取るもの:scenario-unreal-materials からは、パーティクルのマスター マテリアル、インスタンス、テクスチャ設定を受け取ります。scenario-unreal-gameplay からは、数値、キャストアニメーションのタイミング、プールされたスポーン、NDC の書き込み、ひずみの呼び出しを受け取ります。scenario-unreal-world-building からは、破壊可能オブジェクトの配置と数を受け取ります。
- 引き渡すもの:scenario-unreal-performance には、予算シート(システム、Effect Type、上限、プール、シミュレーションの目標、スレッドあたりのコスト、コア数、品質、GC の破片数、アクティブなボディのピーク数、破壊時のスパイク、回復)と再現可能なシナリオを引き渡します。scenario-unreal-cinematics には、Chaos キャッシュとシネマティックのスケーラビリティを引き渡します。scenario-unreal-lighting-rendering には、パーティクルライトと Heterogeneous Volumes を引き渡します。クロスは scenario-unreal-animation の担当です。
UE 5.8 の注記
- Data Channels は 5.5 からプロダクションレディです(GDC 2025 の講演ではまだ実験的とされています)。軽量エミッターは 5.5 からベータで、コンパイル手順は 5.7 で廃止されました。Niagara Fluids はベータです。「Empty」テンプレートは「Minimal」です。
r.HeterogeneousVolumes.Allow(5.8);Niagara Editor Preview Actor(5.7)。- Chaos:GC 作成時のデフォルトの Dataflow テンプレート、ランタイムの Dataflow 評価(5.8);Project Settings の破壊スロットル(5.6)。
- GC Python:
root_proxy_data、size_specific_data、set_dataflow_asset。ボーンごとのデータ(アンカー、破壊時に削除、一方向レベル)はクラスにありません。
参考資料
references/expert-notes.md:専門家による原則、タイムスタンプ、見解の相違、U7 の評価で不足していると判明した点。references/procedures.md:各手順の完全なコード、テストパス、ステータス。references/critique.md:評価基準(指標、しきい値、判定項目)。references/gui-paths.md:同じ作業に使うエディターメニュー。references/sources.md:すべてのソース、認証情報、URL、最適なタイムスタンプ、改訂履歴。scripts/ue_vfx.py:オフライン判定と指標、エディター内ヘルパー(未実行)。