蓝图与 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 的第一大来源。