Emitter 与 System:两层结构怎么理解

Niagara 最让新手困惑的是"为什么有两个层"。一句话:Emitter 是"一种粒子怎么活",System 是"一场特效由哪些 Emitter 组成、各自何时登场"。

类比:乐团与乐谱

  • Emitter ≈ 一个乐手(只会一种乐器,比如小提琴)。它定义一类粒子的完整行为:发射规则、生命周期更新、渲染方式。文件后缀 NE(Niagara Emitter)。
  • System ≈ 一份乐谱(哪个乐手什么时候进入、什么时候退场)。它把若干 Emitter 编排到时间轴上,控制每个 Emitter 的播放循环、开始延迟、结束时机。文件后缀 NS(Niagara System)。

一场交响乐(一个完整特效)= 乐谱(System)+ 多个乐手(Emitter)。

两层的职责边界

职责 Emitter(NE) System(NS)
单个粒子的行为(力、颜色、生命周期) ✅ 定义 ❌ 不关心
发射多少、长什么样 ✅ 定义 ❌ 不关心
多个 Emitter 的先后顺序 ❌ 不关心 ✅ 定义
循环 / 单次 / 延迟播放 ❌ 不关心 ✅ 定义
对外暴露参数(给蓝图调) 可以定义 更常在这里汇总暴露

实际工作节奏

推荐的工作流是自底向上:

  1. 先把每种"单一行为"做成独立 Emitter:烟雾、火星、冲击波、碎石。
  2. 再建 System,把这些 Emitter 拖进时间轴:冲击波 0 秒进入播一次,火星 0.05 秒进入播一次,烟雾循环播放。
  3. 在 System 层做参数收敛:把各 Emitter 里需要外部控制的参数提升(Promote)为 System 级的用户参数,蓝图只面对一个 NS 资产。

常见误区

误区一:把所有东西塞进一个 Emitter。 新手常在一个 Emitter 里用脚本区分"这是烟这是火",模块堆到四五十个。正确做法是拆成烟 Emitter + 火 Emitter,由 System 编排。单一职责既利于复用也利于性能分析。

误区二:System 什么都要管。 System 层做"编排"就好,粒子的具体行为不要下沉到这里改(在 System 里改 Emitter 的参数副本容易和 Emitter 资产脱钩,版本管理时找不到差异)。

误区三:不用 System,蓝图里逐个播 Emitter。 结果是播放时机全靠蓝图 Timer 硬调,无法在编辑器里整体预览和迭代。特效一旦需要在编辑器里"看效果",就必须回到 System 时间轴。