模块与参数:类型、命名与绑定
模块之间通过参数传递数据。参数体系看起来繁琐,但它就是 Niagara 的"变量系统",搞懂命名规则能少走大量弯路。
参数的类型与含义
| 前缀 | 含义 | 可读 / 可写 | 常见例子 |
|---|---|---|---|
无前缀(如 Position) |
每个粒子一份的属性 | 任意模块读写 | Position、Velocity、Color、Lifetime |
Engine. |
引擎每帧传进来的全局状态 | 只读 | Engine.Time、Engine.DeltaTime、Engine.Owner |
User. |
用户暴露参数(从蓝图 / C++ 传入) | 只读(模拟内) | User.Intensity、User.TargetColor |
Emitter. |
发射器级共享变量 | 发射器内可写 | 阶段计数器、共享种子 |
System. |
系统级共享变量 | 整个 NS 内可写 | 跨 Emitter 共享的数据 |
命名的工程规范
参数名字就像代码变量名,项目里要立规矩:
- 用户参数用有业务语义的名字:
User.FireIntensity(火焰强度)、User.WindDirection(风向),而不是User.Param1。 - 自定义粒子属性加项目前缀:
Game.Allowance(余量)、Game.TargetId(目标编号),避免和引擎内置参数撞名。 - 参数从哪里来要写在注释里:在模块的 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(前提是名字对齐)。
