Emitter 与 System:两层结构怎么理解
Niagara 最让新手困惑的是"为什么有两个层"。一句话:Emitter 是"一种粒子怎么活",System 是"一场特效由哪些 Emitter 组成、各自何时登场"。
类比:乐团与乐谱
- Emitter ≈ 一个乐手(只会一种乐器,比如小提琴)。它定义一类粒子的完整行为:发射规则、生命周期更新、渲染方式。文件后缀
NE(Niagara Emitter)。 - System ≈ 一份乐谱(哪个乐手什么时候进入、什么时候退场)。它把若干 Emitter 编排到时间轴上,控制每个 Emitter 的播放循环、开始延迟、结束时机。文件后缀
NS(Niagara System)。
一场交响乐(一个完整特效)= 乐谱(System)+ 多个乐手(Emitter)。
两层的职责边界
| 职责 | Emitter(NE) | System(NS) |
|---|---|---|
| 单个粒子的行为(力、颜色、生命周期) | ✅ 定义 | ❌ 不关心 |
| 发射多少、长什么样 | ✅ 定义 | ❌ 不关心 |
| 多个 Emitter 的先后顺序 | ❌ 不关心 | ✅ 定义 |
| 循环 / 单次 / 延迟播放 | ❌ 不关心 | ✅ 定义 |
| 对外暴露参数(给蓝图调) | 可以定义 | 更常在这里汇总暴露 |
实际工作节奏
推荐的工作流是自底向上:
- 先把每种"单一行为"做成独立 Emitter:烟雾、火星、冲击波、碎石。
- 再建 System,把这些 Emitter 拖进时间轴:冲击波 0 秒进入播一次,火星 0.05 秒进入播一次,烟雾循环播放。
- 在 System 层做参数收敛:把各 Emitter 里需要外部控制的参数提升(Promote)为 System 级的用户参数,蓝图只面对一个 NS 资产。
常见误区
误区一:把所有东西塞进一个 Emitter。 新手常在一个 Emitter 里用脚本区分"这是烟这是火",模块堆到四五十个。正确做法是拆成烟 Emitter + 火 Emitter,由 System 编排。单一职责既利于复用也利于性能分析。
误区二:System 什么都要管。 System 层做"编排"就好,粒子的具体行为不要下沉到这里改(在 System 里改 Emitter 的参数副本容易和 Emitter 资产脱钩,版本管理时找不到差异)。
误区三:不用 System,蓝图里逐个播 Emitter。 结果是播放时机全靠蓝图 Timer 硬调,无法在编辑器里整体预览和迭代。特效一旦需要在编辑器里"看效果",就必须回到 System 时间轴。
