模块与参数:类型、命名与绑定

模块之间通过参数传递数据。参数体系看起来繁琐,但它就是 Niagara 的"变量系统",搞懂命名规则能少走大量弯路。

参数的类型与含义

前缀 含义 可读 / 可写 常见例子
无前缀(如 Position) 每个粒子一份的属性 任意模块读写 Position、Velocity、Color、Lifetime
Engine. 引擎每帧传进来的全局状态 只读 Engine.Time、Engine.DeltaTime、Engine.Owner
User. 用户暴露参数(从蓝图 / C++ 传入) 只读(模拟内) User.Intensity、User.TargetColor
Emitter. 发射器级共享变量 发射器内可写 阶段计数器、共享种子
System. 系统级共享变量 整个 NS 内可写 跨 Emitter 共享的数据

命名的工程规范

参数名字就像代码变量名,项目里要立规矩:

  1. 用户参数用有业务语义的名字:User.FireIntensity(火焰强度)、User.WindDirection(风向),而不是 User.Param1。
  2. 自定义粒子属性加项目前缀:Game.Allowance(余量)、Game.TargetId(目标编号),避免和引擎内置参数撞名。
  3. 参数从哪里来要写在注释里:在模块的 Description 或 Emitter 的 Notes 里写清楚"这个值由蓝图的 Set Vector Parameter 传入"。

参数绑定:把两个模块的参数连起来

在参数的下拉菜单里选 Bind,可以把一个参数绑定到另一个参数或一个表达式上。例如:

  • Velocity 绑定到 Initial Velocity 的输出……
  • 更实用的例子:Sprite Size 的 X/Y 分别绑定到 Lifetime 剩余比例的曲线上,实现"寿命走完粒子缩到 0"。

绑定 vs 直接赋值的区别:绑定是每帧重新求值的引用关系;直接赋值只写一次。所以"随时间变化"的值必须用绑定或者放在 Update 段里更新。

用户参数的三种使用形式

在 Emitter / System 里 + Variable → 选择类型(float / Vector / Color 等)→ 勾选 "User Exposed"。之后:

  • 模块里选 User.XXX 读它;
  • 蓝图用 Set [类型] Parameter (Niagara) 写它(注意节点名带类型:Set Vector Parameter、Set Float Parameter…);
  • C++ 用 UNiagaraComponent::SetVariableFloat 等接口。

一个易错点:用户参数暴露在 Emitter 还是 System 上有讲究。蓝图拿到的多数是 NS 资产,所以在 System 层暴露更方便;System 参数会自动下发给所有 Emitter(前提是名字对齐)。