Cascade 时代的粒子与它的局限
老一代 UE 开发者对 Cascade 的感情是复杂的:它稳定、直观、上手快,但在项目规模化后几乎必然撞墙。先说它到底"痛"在哪,再理解 Niagara 为什么要重做。
Cascade 的设计逻辑
Cascade 是一个单体式发射器:一个粒子发射器(Emitter)内部写死了"怎么发射、怎么更新、怎么渲染"。编辑器里看到的那些模块(Spawn、Lifetime、Initial Velocity、Color Over Life……)是固定管线的一部分,加一个新行为需要:
- 引擎提供的模块不够用 → 写 C++ 新模块(编译一次引擎或插件);
- 想复用一段逻辑到别的发射器 → 复制粘贴整个 Emitter,然后逐个参数对齐;
- 想跨发射器共享数据(比如让 A 发射器的粒子躲避 B 发射器的粒子)→ 基本做不到。
三个典型的撞墙时刻
| 时刻 | Cascade 的表现 | 真实代价 |
|---|---|---|
| 策划要"同一个技能,5 个等级 5 种表现" | 复制 5 份 Emitter,参数各调一遍 | 改一个 bug 要改 5 次,漏改一个就是线上事故 |
| 美术要"粒子跟着角色的骨骼动" | 需要写 C++ 或用很 trick 的 Bone 模块 | 跨部门依赖,排期以周计 |
| 项目后期要优化:砍掉一半粒子 | 逐个打开 Emitter 手调 | 几百个资产,没有人知道全量影响 |
数据驱动的缺失
Cascade 的参数存在资产里,但逻辑本身不是数据。"发射 100 个粒子,每个粒子先上升 1 秒再炸开"——这个行为描述被编译进模块管线,不是一份可以被读取、批量修改、程序生成的数据。这导致:
- 无法做"特效配置表"(策划改不了,必须找美术打开编辑器);
- 无法批量体检("哪些 Emitter 用了 GPU 粒子?""哪些发了超过 500 个?"答不上来);
- 无法程序化生成(一个"枪口火光模板"不能由代码按武器类型参数化产出)。
一句话总结
Cascade 的问题不是"功能不够",而是架构前现代:逻辑与数据不分、资产不可组合、行为不可编程。Niagara 的全部设计都在回答这三个问题——这也是后面四章要展开的内容。
