蓝图与 C++ 控制 Niagara
模拟做得再好,最终要被游戏逻辑调用。这一节梳理 Niagara 组件的播放控制与参数传递,以及最常见的几个坑。
组件的生命周期
| 节点 / 接口 | 作用 | 何时用 |
|---|---|---|
Spawn System at Location |
创建组件并自动播放 | 单次、不跟随 |
Spawn System Attached |
创建并挂在骨骼插槽上 | 跟随 Actor |
Add Niagara Component(C++) |
手动管理组件 | 需要池化复用时 |
Activate / Deactivate |
播放 / 停止 | 池化复用、反复播放 |
Destroy Component |
彻底销毁 | 确定不再用时 |
参数传递
蓝图节点名带类型:
Set Vector Parameter (Niagara)— 三维向量(位置、方向、颜色向量);Set Float Parameter (Niagara)— 单值(规模、强度);Set Color Parameter (Niagara)— 颜色;Set Niagara Variable系列(C++:UNiagaraComponent::SetVariableXxx)。
关键时序原则:Set 要在 Activate 之前,或者配合 ReinitializeSystem。已激活后再设参数,部分版本不会立即反映到当前播放周期。
事件:NS → 蓝图通信
NS 里可以定义 Niagara 事件签名(Event Receiver / Sender),让粒子事件触发蓝图回调:
- 粒子碰撞到地面 → 通知蓝图"在这里放一个焦痕贴花";
- 特效播放结束 →
On System Finished委托 → 蓝图里做收尾(归还对象池、发奖励)。
C++ 层的典型用法
// 伪代码:在一个Actor上管理一个循环特效
UNiagaraComponent* Comp = CreateDefaultSubobject<UNiagaraComponent>("VFX");
Comp->SetupAttachment(Root);
// 运行时
Comp->SetAsset(LoadObject<UNiagaraSystem>(...));
Comp->SetVariableFloat("User.FireIntensity", Level * 0.5f);
Comp->Activate();
五个高频坑速查
| 现象 | 原因 | 解法 |
|---|---|---|
| 参数传了没效果 | Activate 之后才 Set | 调整时序或调 ReinitializeSystem |
| 特效在编辑器里正常、打包后不播 | 资产没被引用(Cook 时裁掉了) | 在 GameFeature / 数据表里显式引用 |
| 循环 NS 被销毁后还在播 | 实际上不是同一次播放 | 检查 AutoDestroy 与组件复用逻辑 |
| Spawn Attached 挂点不对 | 插槽名或 Attach 规则错 | 用 Attach To Component 显式指定 |
| Server 广播后客户端无表现 | NS 播放的定位 / 权限不对 | 参考网络章:客户端侧本地播放 |
最后一个坑(网络)在后续"项目实践"章会展开——它是多人项目里特效 bug 的第一大来源。
