scenario-unreal-vfx

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Unreal VFX (Niagara, Chaos destruction, VFX critique)

Unreal VFX(Niagara、Chaos 破坏、VFX 评审)

Expert level means an effect that tells the player the truth (where it hurts, when it is over), costs what its gameplay class allows across the whole world, and is proven by per-thread numbers on the target core count plus captures scored against a written rubric. Python cannot author Niagara emitters or modules (5.8 API): the agent works through templates with a User parameter contract, Material Instances, Effect Types and Dataflow recipes, and escalates the few graph edits as precise GUI requests. If a sibling skill named here is missing from your available skills, ask the user to install it (
npx skills add scenario-labs/skills --skill <name>
); unattended, proceed from tool schemas and flag the gap.
REQUIRED BACKGROUND: scenario-unreal-expert (channels, review loop, 5.8 traps).
Status (2026-09-24): Unreal is not installed. Offline checks pass (
python3 tests/code/unreal-vfx/run_all.py --offline
); every in-editor snippet is not yet run in Unreal;
job_00_vfx_probe.py
answers the
[verify]
names.
专家级意味着,效果应向玩家如实传达信息(哪里会受伤、伤害何时结束),其成本应符合该 gameplay 类别在整个世界中的允许范围,并且由目标核心数下的逐线程数据以及按书面评分标准评分的采集画面证明。Python 无法编写 Niagara emitters 或 modules(5.8 API):Agent 通过带有 User 参数契约的 templates、Material Instances、Effect Types 和 Dataflow recipes 工作,并将少量图编辑操作升级为精确的 GUI 请求。如果此处提到的某个 sibling skill 未出现在可用 skills 中,请要求用户安装(
npx skills add scenario-labs/skills --skill <name>
);在无人值守的情况下,依据 tool schemas 继续执行并标记该缺口。
必需背景: scenario-unreal-expert(channels、review loop、5.8 traps)。
状态(2026-09-24): 未安装 Unreal。离线检查通过(
python3 tests/code/unreal-vfx/run_all.py --offline
);所有编辑器内代码片段尚未在 Unreal 中运行;
job_00_vfx_probe.py
可回答
[verify]
项。

Stance (the expert delta)

立场(专家级差距)

  • Gameplay truth first. The boldest edge sits on the collision boundary (missile head, AoE rim) and reads the gameplay number (
    User.Radius
    = damage radius), never a hand-matched constant; lingering says "still dangerous" (Keyser #1 [00:09:44], [00:15:21]).
  • Contrast is a screen budget. Near-white core, never pure white; saturation in the fringe; dark saturated halo; contrast highest at the head; a weak projectile gets a hotter core and dark wisps, not a brighter trail (Keyser #3 [00:08:13], [00:12:03]; #4 [00:19:55]). Unexpected white is usually stacked additive duplicates: count spawns before touching color, then back the additive core with an alpha-blended saturated layer (Shishido [00:17:42]-[00:18:14]).
  • Timing is a story. Anticipation rides the character's cast animation (no window: put the interest in the falloff); build-up stops spawning exactly at the hit; the flash peaks on the hit frame ("intensity is not size"); consequences follow causes (flash, then debris and sparks, then smoke); dissipation is shorter than build-up and ends inside the gameplay window. A fast round head strobes: stretch it along velocity and bake motion blur into its texture (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]).
  • Optimize the world, not the effect. An Effect Type on every system first: Lyra went from 227 to 103 active systems, RT 5.07 to 1.51 ms, same look (Kiraly [00:20:48]). The Effect Type is set per system, never per emitter; secondary emitters get Scalability Mode Self. Read GT, GT Concurrent and RT separately at the target core count [00:05:15], then pick a lever that saves that thread: distance culling stops ticking, not rendering, and the scalability manager pays for the check; cull proxies save the tick, not the RT [00:16:57], [00:18:02]; every GPU system pays an RT dispatch even unseen [00:05:47]. FX budgets only on non-critical types, with
    fx.Budget.AdjustedUsageDecayRate
    against oscillation [00:36:50]-[00:37:21].
  • Spawn architecture by class and rate (Kiraly's table [00:45:57]): pool moderate one-shots (Manual Release means Release to Pool), a Data Channel listener for spam, stateless emitters with system state off for simple bursts (footsteps GT 1,387 to 271 us [00:39:24]); NDC and stateless are exclusive; small counts stay on CPU.
  • Destruction cost is active bodies and contacts. Fix in order: rendering (Nanite on the GC, root proxy with the ISM renderer), body count and lifetime (clusters, Remove on Break with random timers and Cluster Crumbling, a per-platform removal multiplier, Tiny Geo), collision (one-way debris, one convex per cluster, boxes under 0.3 relative size), throttles last (Caillaud wPgd1J1Tf70 [00:03:47]-[00:16:18]; Xiao Yue zFiHDRREv7E [00:29:27]).
  • Weapons break walls with strain, not fields. Apply External Strain plus Apply Breaking Linear Velocity scaled by projectile speed, no strain falloff; fields are "heavy and slow" (Van Allen [00:29:29]). Pick one damage model: Material Strength and Connectivity (tune tensile strength on the physical material) or per-level thresholds (tune the array); size-specific is a flag, not a model (Xiao Yue [00:19:54]-[00:20:27]). Heft comes from friction (combine Max) and low restitution; stone density is 2 g/cm3, 2000 is a unit error (Van Allen [00:26:11]).
  • Recipes, not clicks. Templates with exposed parameters and Dataflow graphs with per-asset variables survive art changes and are what an agent reaches reliably (Caillaud t_jyTILDYo8 [00:02:46]).
  • Gameplay 真实性优先。 最醒目的边缘应位于碰撞边界(导弹头部、AoE 边缘),并读取 gameplay 数值(
    User.Radius
    = 伤害半径),绝不能手工匹配常量;残留效果表示“仍然危险”(Keyser #1 [00:09:44]、[00:15:21])。
  • 对比度是屏幕预算。 核心接近白色,但绝不能是纯白;外围保持饱和;使用深色饱和光晕;头部对比度最高;表现力较弱的弹体应使用更炽热的核心和暗色 wisps,而不是更亮的拖尾(Keyser #3 [00:08:13]、[00:12:03];#4 [00:19:55])。意外发白通常源于叠加的 additive 重复项:先统计 spawn 次数,再调整颜色,然后用 alpha-blended 饱和层衬托 additive 核心(Shishido [00:17:42]-[00:18:14])。
  • 时序就是叙事。 预备阶段应与角色施法动画同步(没有窗口期时:把视觉重点放在衰减上);积蓄阶段必须在命中时精确停止生成;闪光在命中帧达到峰值(“强度不等于尺寸”);结果应紧随原因(先闪光,再碎片和火花,最后烟雾);消散时间短于积蓄时间,并在 gameplay 窗口内结束。快速移动的圆形头部会产生频闪:沿速度方向拉伸,并将运动模糊烘焙到纹理中(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])。
  • 优化整个世界,而不是单个效果。 首先为每个 system 设置 Effect Type:Lyra 的活跃 system 从 227 个降至 103 个,RT 从 5.07 降至 1.51 ms,视觉效果不变(Kiraly [00:20:48])。Effect Type 按 system 设置,绝不能按 emitter 设置;次要 emitters 使用 Scalability Mode Self。在目标核心数下分别读取 GT、GT Concurrent 和 RT,然后选择能节省对应线程开销的手段:distance culling 停止 tick,而不是停止 rendering,并且 scalability manager 还要承担检查成本;cull proxies 节省 tick,而不是 RT;即使不可见,每个 GPU system 仍会产生一次 RT dispatch。仅对非关键类型应用 FX budgets,并使用
    fx.Budget.AdjustedUsageDecayRate
    防止振荡([00:36:50]-[00:37:21])。
  • 按类别和速率设计 spawn 架构(Kiraly 的表格 [00:45:57]):对中等频率的一次性效果使用 pooling(Manual Release 表示 Release to Pool);对大量刷出使用 Data Channel listener;简单爆发使用关闭 system state 的 stateless emitters(脚步 GT 从 1,387 降至 271 us [00:39:24]);NDC 与 stateless 互斥;小规模数量保留在 CPU 上。
  • 破坏成本取决于活跃刚体和接触。 按顺序修复:rendering(在 GC 上启用 Nanite;root proxy 配合 ISM renderer)、刚体数量和生命周期(clusters、带随机计时器的 Remove on Break、Cluster Crumbling、逐平台移除倍率、Tiny Geo)、collision(单向 debris、每个 cluster 一个 convex、相对尺寸低于 0.3 的 boxes),最后才处理 throttles(Caillaud wPgd1J1Tf70 [00:03:47]-[00:16:18];Xiao Yue zFiHDRREv7E [00:29:27])。
  • 武器用 strain 破坏墙体,而不是 fields。 应用 External Strain 和 Apply Breaking Linear Velocity,后者按弹体速度缩放,且不采用 strain falloff;fields“沉重且缓慢”(Van Allen [00:29:29])。破坏模型二选一:Material Strength and Connectivity(在 physical material 上调整 tensile strength),或逐级 thresholds(调整数组);size-specific 只是一个 flag,不是模型(Xiao Yue [00:19:54]-[00:20:27])。厚重感来自 friction(combine Max)和低 restitution;石材密度是 2 g/cm3,2000 是单位错误(Van Allen [00:26:11])。
  • 使用 recipes,而不是盲目点击。 带暴露参数和逐资产变量的 templates 与 Dataflow graphs 能在美术修改后继续使用,也是 Agent 能够可靠操作的对象(Caillaud t_jyTILDYo8 [00:02:46])。

Establish first

首先明确

InputWhy it changes the planDefault when silent
Platform, frame rate, min-spec coresper-thread budgets, quality tablesPC 60 fps; cores from scenario-unreal-performance, 4 if unknown (Kiraly)
Gameplay numbers (scenario-unreal-gameplay)radius, speed, damage window, fire rate, max simultaneous, cast animation timingask; never guess a radius
Camera and environmentread at gameplay distance over the real ground colorsthe game's camera and level
Style pillars, importance tierbrightness budget: idle, basic, defensive, damaging, game changer, ultimate (Keyser #1 [00:13:08])three pillars from the art lead
Crowd and destruction scopecopies on screen; walls per level, must-break objects, low-end platformsworst realistic fight; real time, Nanite on
Budgetsno source gives per-effect ms[added] all Niagara at or under about 2 ms GT + GT Concurrent and 1.5 ms RT at min spec; confirm with scenario-unreal-performance
输入为什么会改变方案未提供信息时的默认值
平台、帧率、最低规格核心数逐线程预算、质量档位表PC 60 fps;核心数取自 scenario-unreal-performance,未知时按 4 个(Kiraly)
Gameplay 数值(scenario-unreal-gameplay)半径、速度、伤害窗口、射速、最大同时数量、施法动画时序询问用户;绝不猜测半径
Camera 和环境在实际地面颜色上,按 gameplay 距离检查可读性游戏的 camera 与 level
风格支柱、重要性层级亮度预算:idle、basic、defensive、damaging、game changer、ultimate(Keyser #1 [00:13:08])向 art lead 获取三个风格支柱
群体场景与破坏范围同屏副本数;每关卡墙体数量、必须破坏的物体、低端平台最坏但现实的战斗场景;realtime;启用 Nanite
预算没有来源能给出单效果 ms 数据[新增] 在最低规格下,所有 Niagara 合计 GT + GT Concurrent 约不超过 2 ms、RT 不超过 1.5 ms;通过 scenario-unreal-performance 确认

Workflow

Workflow

  1. Probe once per engine.
    job_00_vfx_probe.py
    (headless). GATE:
    probe.json
    answers the
    [verify]
    items.
  2. Classify elements, group them into systems.
    classify_element
    per element, then
    system_plan
    : one Effect Type per system (its most critical element); the rest get Scalability Mode Self, or their own system when spammy or on GPU.
    System (examples)Effect TypeCritical emittersSecondary (Scalability Mode Self)
    Projectile, beam, tracerNET_OneShotCriticalheadtrail, wisps, embers
    Impact, hit, muzzle flashNET_OneShotCriticalflash, damage ringsmoke, sparks (split if spammy or GPU)
    Debris or impact listener (NDC)NET_OneShot, budget only with decay dampingnoneall
    AoE, status, pickupNET_PersistentCriticalriminterior flavor
    Ambient dust, leaves, rainNET_Ambientnoneall
    GATE:
    system_plan
    has no error.
  3. Timing plan before building. Write the spawn schedule (wind-up from the cast animation, build-up ending at the hit, flash on the hit, debris and sparks, smoke, window end) and run
    spawn_schedule_verdict
    ;
    strobe_risk(speed, head length)
    gives the stretch a fast head needs. GATE: no error; stretch in the template spec.
  4. Template and contract.
    duplicate_template
    ,
    user_parameters
    ,
    contract_verdict
    ; a missing control becomes one GUI request. Curves in that request pass
    fade_curve_verdict
    (opacity fades from mid-life, never shrink-only) and
    flipbook_playback_verdict
    (fast then slow). GATE: contract ok.
  5. Look: materials and textures. Master material and instances from scenario-unreal-materials (erosion, gradient-map LUT, depth fade); reuse textures first (Trümpler [00:16:33]), generate glows, LUTs and noise in Python. Import masks with sRGB off,
    TEXTUREGROUP_Effects
    , big sources capped by Maximum Texture Size; baked flipbooks are premultiplied, so the material must divide RGB by A (
    premultiplied_check
    ). Smoke and fire: baked flipbooks by default; Fluids are Beta. GATE:
    audit_vfx_textures
    ,
    flipbook_check
    clean.
  6. System properties and scalability.
    set_system_properties
    :
    effect_type
    ,
    max_pool_size
    = the type's system cap, prime 0 for mid-play loads, warmup 0, current-frame data off for static effects; world-space trails need fixed bounds of speed x lifetime (
    fixed_bounds_check
    ). Effect Types from
    EFFECT_TYPE_PRESETS
    (
    create_effect_type
    [verify] or GUI once). GATE: no
    NO_EFFECT_TYPE
    in
    audit_niagara
    ;
    caps_verdict
    ,
    budget_verdict
    clean.
  7. Wire to gameplay. scenario-unreal-gameplay spawns with the pooling method, sets User parameters from gameplay data, spawns the wind-up from the cast animation, writes Data Channel payloads, applies strain on hit (
    strain_plan
    ; collision plus strain for must-break objects). On hit, deactivate the trail and let its particles finish [added]. GATE: a PIE hit spawns from the pool (FX Outliner InUse / FreeInPool).
  8. Destructible asset. Watertight, non-intersecting source (
    mesh_watertight_check
    ); fixed seed; pattern by material (concrete noise and grout, wood shrink-fracture-stretch, glass slices or a crack material); two or three levels, anchored; Proximity graph with an area threshold; one damage model; one convex per cluster; interior material with a distance-to-surface bake (Caillaud t_jy [00:29:14]); Remove on Break ranges plus Cluster Crumbling; removal multiplier in the low-end device profile; disable settled debris that never wakes (Xiao Yue [00:28:45]). VFX on breaks needs Chaos data generation in Project Settings plus break notification on the component (
    enable_break_events
    , Xiao Yue [00:08:42]); switch only broken bones to a debris profile. Then
    harden_gc
    ; piece count in a gym at 10, 50, 100 (Caillaud t_jy [00:35:12]). GATE:
    gc_recipe_verdict
    ,
    gc_verdict
    ,
    physmat_check
    clean.
  9. Review loop. Textured review level, Manual exposure, the gameplay camera;
    live_capture_series.py
    or
    capture_ages
    with clean plates;
    score_captures.py
    (a blank frame voids the series); LOOK at the color, grayscale and squint sheets; repeat in PIE ("the viewport lies", Shishido [00:05:05]), over green and brown ground for the color-blind check, in a crowd grid and at
    sg.EffectsQuality
    0 to 3. On white-out run
    duplicate_spawn_check
    on Debugger counts first. One change per pass. GATE: no rubric fail; judgment rows scored (
    references/critique.md
    ).
  10. Measure. Fixed worst fight at the target core count:
    stat unit
    ,
    stat NiagaraOverview
    , Debug HUD, Insights with
    -statnamedevents
    (Niagara is invisible without it, Kiraly [00:10:52]);
    init_for_performance_baseline()
    ;
    lever_check
    before each change;
    budget_oscillation
    when budgets are on. Destruction: frame series around the break, CVD,
    t.OverrideFPS 60
    [verify]. GATE:
    niagara_overview_verdict
    ,
    before_after
    ,
    destruction_run_verdict
    within budget, visual parity.
  11. Deliver the budget sheet to scenario-unreal-performance.
  1. 每个 engine 仅探测一次。
    job_00_vfx_probe.py
    (headless)。GATE:
    probe.json
    必须回答
    [verify]
    项。
  2. 对元素进行分类,并将其归组为 systems。 对每个元素执行
    classify_element
    ,再执行
    system_plan
    :每个 system 使用一个 Effect Type(对应其中最关键的元素);其余元素使用 Scalability Mode Self;如果某个元素会大量刷出或运行于 GPU,则为其创建独立 system。
    System(示例)Effect Type关键 emitters次要项(Scalability Mode Self)
    弹体、光束、曳光弹NET_OneShotCritical头部拖尾、wisps、余烬
    命中、受击、枪口闪光NET_OneShotCritical闪光、伤害环烟雾、火花(大量刷出或使用 GPU 时拆分)
    碎片或命中 listener(NDC)NET_OneShot,仅在启用 decay damping 时使用 budget无全部
    AoE、状态、拾取物NET_PersistentCritical边缘内部氛围效果
    环境灰尘、树叶、雨NET_Ambient无全部
    GATE:
    system_plan
    无错误。
  3. 在构建前制定时序方案。 编写 spawn schedule(从施法动画开始蓄势、积蓄阶段在命中时结束、命中闪光、碎片与火花、烟雾、窗口结束),并运行
    spawn_schedule_verdict
    ;
    strobe_risk(speed, head length)
    可判断快速移动的头部需要怎样的拉伸。GATE:无错误;在 template spec 中落实拉伸。
  4. 使用 template 与 contract。
    duplicate_template
    、
    user_parameters
    、
    contract_verdict
    ;缺失的 control 转化为一个 GUI 请求。请求中的 curves 必须通过
    fade_curve_verdict
    (opacity 从生命期中段开始淡出,绝不能只缩小)和
    flipbook_playback_verdict
    (先快后慢)。GATE:contract 正常。
  5. 外观:materials 与 textures。 从 scenario-unreal-materials 获取 master material 及其实例(erosion、gradient-map LUT、depth fade);优先复用 textures(Trümpler [00:16:33]),在 Python 中生成 glows、LUT 和 noise。导入 masks 时关闭 sRGB,使用
    TEXTUREGROUP_Effects
    ,大型源文件受 Maximum Texture Size 限制;预乘烘焙的 flipbooks 要求材质将 RGB 除以 A(
    premultiplied_check
    )。Smoke 和 fire 默认使用烘焙 flipbooks;Fluids 为 Beta。GATE:
    audit_vfx_textures
    、
    flipbook_check
    均无问题。
  6. 设置 system properties 与 scalability。
    set_system_properties
    :
    effect_type
    ;
    max_pool_size
    = 该类型的 system 上限;mid-play 加载使用 prime 0;warmup 0;静态效果关闭 current-frame data;world-space trails 需要按速度 × 生命周期设置固定 bounds(
    fixed_bounds_check
    )。Effect Types 来自
    EFFECT_TYPE_PRESETS
    (执行
    create_effect_type
    [verify],或通过 GUI 操作一次)。GATE:
    audit_niagara
    中不得出现
    NO_EFFECT_TYPE
    ;
    caps_verdict
    、
    budget_verdict
    均无问题。
  7. 接入 gameplay。 scenario-unreal-gameplay 使用 pooling method 生成效果,根据 gameplay 数据设置 User parameters,从施法动画启动 wind-up,写入 Data Channel payloads,并在命中时应用 strain(
    strain_plan
    ;对于必须破坏的物体,同时使用 collision 与 strain)。命中时停用 trail,让其 particles 自行结束 [新增]。GATE:PIE 中的命中效果从 pool 中生成(FX Outliner InUse / FreeInPool)。
  8. 准备可破坏资产。 源模型必须 watertight 且互不相交(
    mesh_watertight_check
    );使用固定 seed;按材质选择破坏模式(concrete 使用 noise 和 grout,wood 使用 shrink-fracture-stretch,glass 使用 slices 或 crack material);采用 two or three levels 并进行 anchored;使用带 area threshold 的 Proximity graph;只选一种 damage model;每个 cluster 使用一个 convex;interior material 烘焙 distance-to-surface(Caillaud t_jy [00:29:14]);设置 Remove on Break ranges 和 Cluster Crumbling;在低端设备 profile 中设置 removal multiplier;禁用永远不会再唤醒的 settled debris(Xiao Yue [00:28:45])。破坏时的 VFX 需要在 Project Settings 中启用 Chaos data generation,并在 component 上配置 break notification(
    enable_break_events
    ,Xiao Yue [00:08:42]);仅在 break event 发生时将 broken bones 切换到 debris profile。随后运行
    harden_gc
    ;在测试场景中测试 10、50、100 个 piece count(Caillaud t_jy [00:35:12])。GATE:
    gc_recipe_verdict
    、
    gc_verdict
    、
    physmat_check
    均无问题。
  9. 评审循环。 使用带 textures 的评审 level、Manual exposure 和 gameplay camera;通过
    live_capture_series.py
    或
    capture_ages
    拍摄 clean plates;用
    score_captures.py
    评分(空白帧会使整组数据作废);检查 color、grayscale 和 squint sheets;在 PIE 中重复评审(“viewport 会误导人”,Shishido [00:05:05]),并在绿色和棕色地面上进行 color-blind check,还要覆盖 crowd grid 以及
    sg.EffectsQuality
    0 到 3。出现 white-out 时,先在 Debugger counts 上运行
    duplicate_spawn_check
    。每轮只改一项。GATE:评分标准不得有 fail;对 judgment rows 进行评分(
    references/critique.md
    )。
  10. 测量。 在目标核心数下,以固定的 worst fight 场景执行:
    stat unit
    、
    stat NiagaraOverview
    、Debug HUD,以及带
    -statnamedevents
    的 Insights(否则 Niagara 不可见,Kiraly [00:10:52]);运行
    init_for_performance_baseline()
    ;每次变更前执行
    lever_check
    ;启用 budgets 时执行
    budget_oscillation
    。破坏测试:捕捉 break 前后的 frame series,执行 CVD,并设置
    t.OverrideFPS 60
    [verify]。GATE:
    niagara_overview_verdict
    通过;
    before_after
    与
    destruction_run_verdict
    在预算内;视觉表现一致。
  11. 交付。 向 scenario-unreal-performance 交付 budget sheet。

Numbers

数值

ValueRelative toSource
NET_OneShot: 15 per system, about 30 per type, Spawn Only, Kill and Clear, instant cull 0.0fire-and-forget, not criticalKiraly [00:22:26]
NET_PickupPersistent: 5 (sight lines), Continuous, Asleep, cull delay 1.0 spersistent criticalKiraly [00:24:03]
Max Pool Size 32, Prime 0 (defaults); type cap = pool sizeper systemKiraly [00:32:18], [00:33:22]
Flipbook 8 x 8 on 1024 = 128 px tiles, end frame 63, bake at 30 fpsbakerFlipbook Baker doc
Thresholds 5000 / 500 / 50; strain 50000, radius 100, velocity 500quickstart wallChaos docs
Boxes below 0.3 relative size; 4,000 fragments in 4 levels, about 200 bodies hitleaf proxies; clusteringXiao Yue [00:25:51], [00:22:32]
Remove on sleep 3 s; removal 5 to 10 s, then a per-platform multiplierdebrisCaillaud [00:10:43], [00:11:24]
数值相对于来源
NET_OneShot:每个 system 15 个、每种 type 约 30 个、Spawn Only、Kill and Clear、instant cull 0.0fire-and-forget,非关键Kiraly [00:22:26]
NET_PickupPersistent:5 个(sight lines)、Continuous、Asleep、cull delay 1.0 s持久关键Kiraly [00:24:03]
Max Pool Size 32、Prime 0(默认值);type cap = pool size每个 systemKiraly [00:32:18]、[00:33:22]
1024 上的 Flipbook 8 x 8 = 128 px tiles、end frame 63、以 30 fps 烘焙bakerFlipbook Baker doc
Thresholds 5000 / 500 / 50;strain 50000、radius 100、velocity 500quickstart wallChaos docs
相对尺寸低于 0.3 的 boxes;4 个 level 中 4,000 个 fragments、约命中 200 个 bodiesleaf proxies;clusteringXiao Yue [00:25:51]、[00:22:32]
Remove on sleep 3 s;removal 5 到 10 s,然后应用逐平台倍率debrisCaillaud [00:10:43]、[00:11:24]

Quality gates

质量门槛

  • Measurable: audits (
    audit_niagara
    ,
    audit_gc
    ,
    audit_vfx_textures
    ,
    caps_verdict
    ,
    system_plan
    ,
    gc_recipe_verdict
    ); per-thread stats at the target core count, averages and spikes; break spike and recovery; capture rubric (footprint vs radius, value bands, blowout, saturation under values, 60 / 30 / 10 with the accent at the focal point, size classes held over time, head contrast, color-blind contrast, intensity curve, schedule, strobing);
    image_checks
    rejects blank frames.
  • Visual: grayscale read at gameplay distance; popcorning; story beats; crowd read; no pops across quality levels; the break reads as the material with thick interiors, no floating chunks, heavy debris, removal hidden by dust.
  • 可衡量: audits(
    audit_niagara
    、
    audit_gc
    、
    audit_vfx_textures
    、
    caps_verdict
    、
    system_plan
    、
    gc_recipe_verdict
    );目标核心数下的逐线程 stats、均值与峰值;破坏尖峰和恢复;采集画面评分标准(footprint 与 radius 的关系、value bands、blowout、低于阈值的 saturation、60 / 30 / 10 且 accent 位于焦点、随时间保持的 size classes、head contrast、color-blind contrast、intensity curve、schedule、strobing);
    image_checks
    拒绝空白帧。
  • 视觉: 在 gameplay 距离下进行 grayscale read;无 popcorning;具备 story beats;具备 crowd read;质量档位之间无跳变;破坏效果应呈现对应材质、厚重内部、无悬浮碎块、无过重 debris,且移除过程由 dust 遮蔽。

Common mistakes

常见错误

MistakeWhat it looks likeFix
Hand-matched radiusring larger than the damage zone
User.Radius
from gameplay
White blowoutflat white blobcount duplicates, then an alpha-blended saturated layer behind the additive core
Round head at speedstrobing dotsstretch along velocity, motion blur in the texture
Build-up after the hit; smoke before the flashmuddy payoffspawn schedule: stop at the hit, causes first
Shrink-only fadepopcorning cardsopacity fade from mid-life, matched layer colors
Effect Type per emitterembers get the uncullable typeone type per system, Scalability Mode Self
Distance culling to cut RTRT unchanged
lever_check
: caps, CPU sims, stateless
Budget without decaycull, respawn, culldecay rate, non-critical types only
Fixed bounds smaller than the trailtrail vanishes on screen
fixed_bounds_check
Destroying the projectile on impacttrail pops offdeactivate, let particles finish
Sleep to hold a wallwakes on a bumpanchor or kinematic bones
Default connection graphfloating chunks, corner hingesProximity or Bounds Overlap Filtered
MSC with a tuned threshold arraytuning does nothingtensile strength on the physical material
Field or strain falloff per bulletphysics spikestrain plus breaking velocity, no falloff
Debris profile on the whole GCplayer walks through the intact wallswitch broken bones on the break event
Sleeping debris that never wakessolver costdisable
gc.removal_duration = ...
refused (read-only attribute)
set_editor_property
错误表现修复
手工匹配半径圆环大于伤害区域从 gameplay 获取
User.Radius
白色过曝扁平的白团统计重复项,然后在 additive 核心后添加 alpha-blended 饱和层
高速下的圆形头部频闪点阵沿速度方向拉伸,并在纹理中加入运动模糊
命中后仍在积蓄;烟雾先于闪光表现含混、缺少高潮spawn schedule:在命中时停止生成,先呈现原因
仅缩放淡出卡片式 popcorning从生命期中段开始做 opacity fade,并匹配各层颜色
按 emitter 设置 Effect Type余烬获得不可剔除的类型每个 system 使用一个 type,并设置 Scalability Mode Self
用 distance culling 降低 RTRT 未变化
lever_check
:caps、CPU sims、stateless
预算缺少 decay剔除、重新生成、再次剔除使用 decay rate,并仅应用于非关键类型
固定 bounds 小于拖尾拖尾从屏幕消失
fixed_bounds_check
命中时销毁弹体拖尾突然消失停用弹体,让 particles 自行结束
通过 Sleep 固定墙体受到碰撞后重新唤醒设为 anchored 或使用 kinematic bones
默认 connection graph悬浮碎块、边角铰链Proximity 或 Bounds Overlap Filtered
使用 MSC 和调优后的 threshold array调优未产生效果在 physical material 上设置 tensile strength
每颗弹丸使用 field 或 strain falloff物理性能尖峰strain 加 breaking velocity,不使用 falloff
整个 GC 使用 debris profile玩家可以穿过完好的墙体在 break event 中切换 broken bones
永远不会唤醒的沉睡 debrissolver cost禁用
gc.removal_duration = ...
被拒绝(只读属性)
set_editor_property

Handoffs

交接

  • Receives from scenario-unreal-materials: particle master material, instances, texture settings; from scenario-unreal-gameplay: numbers, cast animation timing, pooled spawns, NDC writes, strain calls; from scenario-unreal-world-building: destructible placements and counts.
  • Delivers to scenario-unreal-performance: a budget sheet (system, Effect Type, caps, pool, sim target, per-thread cost, core count, quality; GCs with pieces, peak active bodies, break spike, recovery) plus the repeatable scenario; to scenario-unreal-cinematics: Chaos caches, Cinematic scalability; to scenario-unreal-lighting-rendering: particle lights, Heterogeneous Volumes. Cloth belongs to scenario-unreal-animation.
  • 接收 scenario-unreal-materials 的 particle master material、instances、texture settings;接收 scenario-unreal-gameplay 的 numbers、cast animation timing、pooled spawns、NDC writes、strain calls;接收 scenario-unreal-world-building 的 destructible placements and counts。
  • 交付给 scenario-unreal-performance:budget sheet(system、Effect Type、caps、pool、sim target、逐线程成本、核心数、质量;GC 的 pieces、peak active bodies、break spike、recovery)以及可重复的 scenario;交付给 scenario-unreal-cinematics:Chaos caches、Cinematic scalability;交付给 scenario-unreal-lighting-rendering:particle lights、Heterogeneous Volumes。Cloth 属于 scenario-unreal-animation。

UE 5.8 notes

UE 5.8 说明

  • Data Channels Production Ready since 5.5 (the GDC 2025 talk still says experimental); lightweight emitters Beta since 5.5, compile step dropped in 5.7; Niagara Fluids Beta; "Empty" template is "Minimal".
  • r.HeterogeneousVolumes.Allow
    (5.8); Niagara Editor Preview Actor (5.7).
  • Chaos: default Dataflow template at GC creation, runtime Dataflow evaluation (5.8); destruction throttles in Project Settings (5.6).
  • GC Python:
    root_proxy_data
    ,
    size_specific_data
    ,
    set_dataflow_asset
    ; per-bone data (anchors, Remove on Break, one-way levels) is not on the class.
  • Data Channels 自 5.5 起为 Production Ready(GDC 2025 的演讲仍称 experimental);lightweight emitters 自 5.5 起为 Beta,compile step 于 5.7 移除;Niagara Fluids 为 Beta;“Empty” template 现为“Minimal”。
  • r.HeterogeneousVolumes.Allow
    (5.8);Niagara Editor Preview Actor(5.7)。
  • Chaos:创建 GC 时提供默认 Dataflow template;运行时 Dataflow evaluation(5.8);Project Settings 中的 destruction throttles(5.6)。
  • GC Python:
    root_proxy_data
    、
    size_specific_data
    、
    set_dataflow_asset
    ;逐 bone 数据(anchors、Remove on Break、one-way levels)不在该 class 上。

References

参考资料

  • references/expert-notes.md
    : principles by expert, timestamps, disagreements, what the U7 grade found missing.
  • references/procedures.md
    : full code, test path and status per procedure.
  • references/critique.md
    : the rubric (metrics, thresholds, judgment rows).
  • references/gui-paths.md
    : editor menus for the same work.
  • references/sources.md
    : every source, credential, URL, best timestamps, revision history.
  • scripts/ue_vfx.py
    : offline verdicts and metrics; in-editor helpers (not yet run).
  • references/expert-notes.md
    :按专家整理的原则、时间戳、分歧,以及 U7 评级发现缺失的内容。
  • references/procedures.md
    :各 procedure 的完整代码、测试路径和状态。
  • references/critique.md
    :评分标准(metrics、thresholds、judgment rows)。
  • references/gui-paths.md
    :执行同类工作的 editor menus。
  • references/sources.md
    :全部 sources、credentials、URLs、最佳时间戳和修订历史。
  • scripts/ue_vfx.py
    :离线 verdicts 和 metrics;编辑器内 helpers(尚未运行)。