scenario-unreal-vfx
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseUnreal 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 (); unattended, proceed from tool schemas and flag the gap.
npx skills add scenario-labs/skills --skill <name>REQUIRED BACKGROUND: scenario-unreal-expert (channels, review loop, 5.8 traps).
Status (2026-09-24): Unreal is not installed. Offline checks pass (); every in-editor snippet is not yet run in Unreal; answers the names.
python3 tests/code/unreal-vfx/run_all.py --offlinejob_00_vfx_probe.py[verify]专家级意味着,效果应向玩家如实传达信息(哪里会受伤、伤害何时结束),其成本应符合该 gameplay 类别在整个世界中的允许范围,并且由目标核心数下的逐线程数据以及按书面评分标准评分的采集画面证明。Python 无法编写 Niagara emitters 或 modules(5.8 API):Agent 通过带有 User 参数契约的 templates、Material Instances、Effect Types 和 Dataflow recipes 工作,并将少量图编辑操作升级为精确的 GUI 请求。如果此处提到的某个 sibling skill 未出现在可用 skills 中,请要求用户安装();在无人值守的情况下,依据 tool schemas 继续执行并标记该缺口。
npx skills add scenario-labs/skills --skill <name>必需背景: scenario-unreal-expert(channels、review loop、5.8 traps)。
状态(2026-09-24): 未安装 Unreal。离线检查通过();所有编辑器内代码片段尚未在 Unreal 中运行; 可回答 项。
python3 tests/code/unreal-vfx/run_all.py --offlinejob_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 (= damage radius), never a hand-matched constant; lingering says "still dangerous" (Keyser #1 [00:09:44], [00:15:21]).
User.Radius - 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 against oscillation [00:36:50]-[00:37:21].
fx.Budget.AdjustedUsageDecayRate - 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 数值(= 伤害半径),绝不能手工匹配常量;残留效果表示“仍然危险”(Keyser #1 [00:09:44]、[00:15:21])。
User.Radius - 对比度是屏幕预算。 核心接近白色,但绝不能是纯白;外围保持饱和;使用深色饱和光晕;头部对比度最高;表现力较弱的弹体应使用更炽热的核心和暗色 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,并使用 防止振荡([00:36:50]-[00:37:21])。
fx.Budget.AdjustedUsageDecayRate - 按类别和速率设计 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
首先明确
| Input | Why it changes the plan | Default when silent |
|---|---|---|
| Platform, frame rate, min-spec cores | per-thread budgets, quality tables | PC 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 timing | ask; never guess a radius |
| Camera and environment | read at gameplay distance over the real ground colors | the game's camera and level |
| Style pillars, importance tier | brightness budget: idle, basic, defensive, damaging, game changer, ultimate (Keyser #1 [00:13:08]) | three pillars from the art lead |
| Crowd and destruction scope | copies on screen; walls per level, must-break objects, low-end platforms | worst realistic fight; real time, Nanite on |
| Budgets | no 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
-
Probe once per engine.(headless). GATE:
job_00_vfx_probe.pyanswers theprobe.jsonitems.[verify] -
Classify elements, group them into systems.per element, then
classify_element: 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_planSystem (examples) Effect Type Critical emitters Secondary (Scalability Mode Self) Projectile, beam, tracer NET_OneShotCritical head trail, wisps, embers Impact, hit, muzzle flash NET_OneShotCritical flash, damage ring smoke, sparks (split if spammy or GPU) Debris or impact listener (NDC) NET_OneShot, budget only with decay damping none all AoE, status, pickup NET_PersistentCritical rim interior flavor Ambient dust, leaves, rain NET_Ambient none all GATE:has no error.system_plan -
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_verdictgives the stretch a fast head needs. GATE: no error; stretch in the template spec.strobe_risk(speed, head length) -
Template and contract.,
duplicate_template,user_parameters; a missing control becomes one GUI request. Curves in that request passcontract_verdict(opacity fades from mid-life, never shrink-only) andfade_curve_verdict(fast then slow). GATE: contract ok.flipbook_playback_verdict -
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,, big sources capped by Maximum Texture Size; baked flipbooks are premultiplied, so the material must divide RGB by A (
TEXTUREGROUP_Effects). Smoke and fire: baked flipbooks by default; Fluids are Beta. GATE:premultiplied_check,audit_vfx_texturesclean.flipbook_check -
System properties and scalability.:
set_system_properties,effect_type= 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 (max_pool_size). Effect Types fromfixed_bounds_check(EFFECT_TYPE_PRESETS[verify] or GUI once). GATE: nocreate_effect_typeinNO_EFFECT_TYPE;audit_niagara,caps_verdictclean.budget_verdict -
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 (; 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).
strain_plan -
Destructible asset. Watertight, non-intersecting source (); 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 (
mesh_watertight_check, Xiao Yue [00:08:42]); switch only broken bones to a debris profile. Thenenable_break_events; piece count in a gym at 10, 50, 100 (Caillaud t_jy [00:35:12]). GATE:harden_gc,gc_recipe_verdict,gc_verdictclean.physmat_check -
Review loop. Textured review level, Manual exposure, the gameplay camera;or
live_capture_series.pywith clean plates;capture_ages(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 atscore_captures.py0 to 3. On white-out runsg.EffectsQualityon Debugger counts first. One change per pass. GATE: no rubric fail; judgment rows scored (duplicate_spawn_check).references/critique.md -
Measure. Fixed worst fight at the target core count:,
stat unit, Debug HUD, Insights withstat NiagaraOverview(Niagara is invisible without it, Kiraly [00:10:52]);-statnamedevents;init_for_performance_baseline()before each change;lever_checkwhen budgets are on. Destruction: frame series around the break, CVD,budget_oscillation[verify]. GATE:t.OverrideFPS 60,niagara_overview_verdict,before_afterwithin budget, visual parity.destruction_run_verdict -
Deliver the budget sheet to scenario-unreal-performance.
-
每个 engine 仅探测一次。(headless)。GATE:
job_00_vfx_probe.py必须回答probe.json项。[verify] -
对元素进行分类,并将其归组为 systems。 对每个元素执行,再执行
classify_element:每个 system 使用一个 Effect Type(对应其中最关键的元素);其余元素使用 Scalability Mode Self;如果某个元素会大量刷出或运行于 GPU,则为其创建独立 system。system_planSystem(示例) 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 -
在构建前制定时序方案。 编写 spawn schedule(从施法动画开始蓄势、积蓄阶段在命中时结束、命中闪光、碎片与火花、烟雾、窗口结束),并运行;
spawn_schedule_verdict可判断快速移动的头部需要怎样的拉伸。GATE:无错误;在 template spec 中落实拉伸。strobe_risk(speed, head length) -
使用 template 与 contract。、
duplicate_template、user_parameters;缺失的 control 转化为一个 GUI 请求。请求中的 curves 必须通过contract_verdict(opacity 从生命期中段开始淡出,绝不能只缩小)和fade_curve_verdict(先快后慢)。GATE:contract 正常。flipbook_playback_verdict -
外观: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,使用,大型源文件受 Maximum Texture Size 限制;预乘烘焙的 flipbooks 要求材质将 RGB 除以 A(
TEXTUREGROUP_Effects)。Smoke 和 fire 默认使用烘焙 flipbooks;Fluids 为 Beta。GATE:premultiplied_check、audit_vfx_textures均无问题。flipbook_check -
设置 system properties 与 scalability。:
set_system_properties;effect_type= 该类型的 system 上限;mid-play 加载使用 prime 0;warmup 0;静态效果关闭 current-frame data;world-space trails 需要按速度 × 生命周期设置固定 bounds(max_pool_size)。Effect Types 来自fixed_bounds_check(执行EFFECT_TYPE_PRESETS[verify],或通过 GUI 操作一次)。GATE:create_effect_type中不得出现audit_niagara;NO_EFFECT_TYPE、caps_verdict均无问题。budget_verdict -
接入 gameplay。 scenario-unreal-gameplay 使用 pooling method 生成效果,根据 gameplay 数据设置 User parameters,从施法动画启动 wind-up,写入 Data Channel payloads,并在命中时应用 strain(;对于必须破坏的物体,同时使用 collision 与 strain)。命中时停用 trail,让其 particles 自行结束 [新增]。GATE:PIE 中的命中效果从 pool 中生成(FX Outliner InUse / FreeInPool)。
strain_plan -
准备可破坏资产。 源模型必须 watertight 且互不相交();使用固定 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(
mesh_watertight_check,Xiao Yue [00:08:42]);仅在 break event 发生时将 broken bones 切换到 debris profile。随后运行enable_break_events;在测试场景中测试 10、50、100 个 piece count(Caillaud t_jy [00:35:12])。GATE:harden_gc、gc_recipe_verdict、gc_verdict均无问题。physmat_check -
评审循环。 使用带 textures 的评审 level、Manual exposure 和 gameplay camera;通过或
live_capture_series.py拍摄 clean plates;用capture_ages评分(空白帧会使整组数据作废);检查 color、grayscale 和 squint sheets;在 PIE 中重复评审(“viewport 会误导人”,Shishido [00:05:05]),并在绿色和棕色地面上进行 color-blind check,还要覆盖 crowd grid 以及score_captures.py0 到 3。出现 white-out 时,先在 Debugger counts 上运行sg.EffectsQuality。每轮只改一项。GATE:评分标准不得有 fail;对 judgment rows 进行评分(duplicate_spawn_check)。references/critique.md -
测量。 在目标核心数下,以固定的 worst fight 场景执行:、
stat unit、Debug HUD,以及带stat NiagaraOverview的 Insights(否则 Niagara 不可见,Kiraly [00:10:52]);运行-statnamedevents;每次变更前执行init_for_performance_baseline();启用 budgets 时执行lever_check。破坏测试:捕捉 break 前后的 frame series,执行 CVD,并设置budget_oscillation[verify]。GATE:t.OverrideFPS 60通过;niagara_overview_verdict与before_after在预算内;视觉表现一致。destruction_run_verdict -
交付。 向 scenario-unreal-performance 交付 budget sheet。
Numbers
数值
| Value | Relative to | Source |
|---|---|---|
| NET_OneShot: 15 per system, about 30 per type, Spawn Only, Kill and Clear, instant cull 0.0 | fire-and-forget, not critical | Kiraly [00:22:26] |
| NET_PickupPersistent: 5 (sight lines), Continuous, Asleep, cull delay 1.0 s | persistent critical | Kiraly [00:24:03] |
| Max Pool Size 32, Prime 0 (defaults); type cap = pool size | per system | Kiraly [00:32:18], [00:33:22] |
| Flipbook 8 x 8 on 1024 = 128 px tiles, end frame 63, bake at 30 fps | baker | Flipbook Baker doc |
| Thresholds 5000 / 500 / 50; strain 50000, radius 100, velocity 500 | quickstart wall | Chaos docs |
| Boxes below 0.3 relative size; 4,000 fragments in 4 levels, about 200 bodies hit | leaf proxies; clustering | Xiao Yue [00:25:51], [00:22:32] |
| Remove on sleep 3 s; removal 5 to 10 s, then a per-platform multiplier | debris | Caillaud [00:10:43], [00:11:24] |
| 数值 | 相对于 | 来源 |
|---|---|---|
| NET_OneShot:每个 system 15 个、每种 type 约 30 个、Spawn Only、Kill and Clear、instant cull 0.0 | fire-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 | 每个 system | Kiraly [00:32:18]、[00:33:22] |
| 1024 上的 Flipbook 8 x 8 = 128 px tiles、end frame 63、以 30 fps 烘焙 | baker | Flipbook Baker doc |
| Thresholds 5000 / 500 / 50;strain 50000、radius 100、velocity 500 | quickstart wall | Chaos docs |
| 相对尺寸低于 0.3 的 boxes;4 个 level 中 4,000 个 fragments、约命中 200 个 bodies | leaf proxies;clustering | Xiao Yue [00:25:51]、[00:22:32] |
| Remove on sleep 3 s;removal 5 到 10 s,然后应用逐平台倍率 | debris | Caillaud [00:10:43]、[00:11:24] |
Quality gates
质量门槛
- Measurable: audits (,
audit_niagara,audit_gc,audit_vfx_textures,caps_verdict,system_plan); 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);gc_recipe_verdictrejects blank frames.image_checks - 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);目标核心数下的逐线程 stats、均值与峰值;破坏尖峰和恢复;采集画面评分标准(footprint 与 radius 的关系、value bands、blowout、低于阈值的 saturation、60 / 30 / 10 且 accent 位于焦点、随时间保持的 size classes、head contrast、color-blind contrast、intensity curve、schedule、strobing);gc_recipe_verdict拒绝空白帧。image_checks - 视觉: 在 gameplay 距离下进行 grayscale read;无 popcorning;具备 story beats;具备 crowd read;质量档位之间无跳变;破坏效果应呈现对应材质、厚重内部、无悬浮碎块、无过重 debris,且移除过程由 dust 遮蔽。
Common mistakes
常见错误
| Mistake | What it looks like | Fix |
|---|---|---|
| Hand-matched radius | ring larger than the damage zone | |
| White blowout | flat white blob | count duplicates, then an alpha-blended saturated layer behind the additive core |
| Round head at speed | strobing dots | stretch along velocity, motion blur in the texture |
| Build-up after the hit; smoke before the flash | muddy payoff | spawn schedule: stop at the hit, causes first |
| Shrink-only fade | popcorning cards | opacity fade from mid-life, matched layer colors |
| Effect Type per emitter | embers get the uncullable type | one type per system, Scalability Mode Self |
| Distance culling to cut RT | RT unchanged | |
| Budget without decay | cull, respawn, cull | decay rate, non-critical types only |
| Fixed bounds smaller than the trail | trail vanishes on screen | |
| Destroying the projectile on impact | trail pops off | deactivate, let particles finish |
| Sleep to hold a wall | wakes on a bump | anchor or kinematic bones |
| Default connection graph | floating chunks, corner hinges | Proximity or Bounds Overlap Filtered |
| MSC with a tuned threshold array | tuning does nothing | tensile strength on the physical material |
| Field or strain falloff per bullet | physics spike | strain plus breaking velocity, no falloff |
| Debris profile on the whole GC | player walks through the intact wall | switch broken bones on the break event |
| Sleeping debris that never wakes | solver cost | disable |
| refused (read-only attribute) | |
| 错误 | 表现 | 修复 |
|---|---|---|
| 手工匹配半径 | 圆环大于伤害区域 | 从 gameplay 获取 |
| 白色过曝 | 扁平的白团 | 统计重复项,然后在 additive 核心后添加 alpha-blended 饱和层 |
| 高速下的圆形头部 | 频闪点阵 | 沿速度方向拉伸,并在纹理中加入运动模糊 |
| 命中后仍在积蓄;烟雾先于闪光 | 表现含混、缺少高潮 | spawn schedule:在命中时停止生成,先呈现原因 |
| 仅缩放淡出 | 卡片式 popcorning | 从生命期中段开始做 opacity fade,并匹配各层颜色 |
| 按 emitter 设置 Effect Type | 余烬获得不可剔除的类型 | 每个 system 使用一个 type,并设置 Scalability Mode Self |
| 用 distance culling 降低 RT | RT 未变化 | |
| 预算缺少 decay | 剔除、重新生成、再次剔除 | 使用 decay rate,并仅应用于非关键类型 |
| 固定 bounds 小于拖尾 | 拖尾从屏幕消失 | |
| 命中时销毁弹体 | 拖尾突然消失 | 停用弹体,让 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 |
| 永远不会唤醒的沉睡 debris | solver cost | 禁用 |
| 被拒绝(只读属性) | |
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".
- (5.8); Niagara Editor Preview Actor (5.7).
r.HeterogeneousVolumes.Allow - 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; per-bone data (anchors, Remove on Break, one-way levels) is not on the class.set_dataflow_asset
- Data Channels 自 5.5 起为 Production Ready(GDC 2025 的演讲仍称 experimental);lightweight emitters 自 5.5 起为 Beta,compile step 于 5.7 移除;Niagara Fluids 为 Beta;“Empty” template 现为“Minimal”。
- (5.8);Niagara Editor Preview Actor(5.7)。
r.HeterogeneousVolumes.Allow - Chaos:创建 GC 时提供默认 Dataflow template;运行时 Dataflow evaluation(5.8);Project Settings 中的 destruction throttles(5.6)。
- GC Python:、
root_proxy_data、size_specific_data;逐 bone 数据(anchors、Remove on Break、one-way levels)不在该 class 上。set_dataflow_asset
References
参考资料
- : principles by expert, timestamps, disagreements, what the U7 grade found missing.
references/expert-notes.md - : full code, test path and status per procedure.
references/procedures.md - : the rubric (metrics, thresholds, judgment rows).
references/critique.md - : editor menus for the same work.
references/gui-paths.md - : every source, credential, URL, best timestamps, revision history.
references/sources.md - : offline verdicts and metrics; in-editor helpers (not yet run).
scripts/ue_vfx.py
- :按专家整理的原则、时间戳、分歧,以及 U7 评级发现缺失的内容。
references/expert-notes.md - :各 procedure 的完整代码、测试路径和状态。
references/procedures.md - :评分标准(metrics、thresholds、judgment rows)。
references/critique.md - :执行同类工作的 editor menus。
references/gui-paths.md - :全部 sources、credentials、URLs、最佳时间戳和修订历史。
references/sources.md - :离线 verdicts 和 metrics;编辑器内 helpers(尚未运行)。
scripts/ue_vfx.py