
做角色大招特效时Niagara 给人的感觉常常是“功能强大但上手很费劲”。各种发射器、模块、数据接口、渲染器堆在一起参数一多就不知道调哪个网上资料多是讲单个模块很少有一个完整案例把配置串联起来。这篇文章就以“死神灵压爆发”特效为例子带大家从头制作一套暗黑风格的角色大招特效包含 Niagara 发射器搭建、材质编写、参数配置和蓝图调用等完整流程。零基础可以照着一步步做已经接触过 Niagara 的开发者也可以直接看参数表和排错思路。先看一下最终要实现的效果拆解角色周围突然爆发一圈黑色灵压粒子粒子快速扩散并带有暗红色火焰拖尾中心区域出现短暂的能量汇聚光圈随后地面被冲击波推开同时伴随大量散落的黑色碎片。这个特效拆开来看就是三个发射器组合的结果中心爆发发射器、环形冲击波发射器、碎片拖尾发射器。下面我会把三个发射器如何组合、参数如何联动、材质如何配合都讲清楚。1. 背景与核心概念1.1 Niagara 到底是什么Niagara 是虚幻引擎新一代粒子特效系统用来替代早期的 Cascade 粒子系统。简单理解Niagara 就像一套“可视化数据流编程工具”每个特效由多个发射器组成每个发射器又包含大量模块化的粒子行为比如粒子的生成位置、初始速度、生命周期、颜色变化、受力效果等。和 Cascade 相比Niagara 最大的优势是数据驱动和可编程性。你既可以用已有模块快速搭建效果也可以写 HLSL 自定义粒子行为既可以用蓝图动态控制粒子参数也可以在 GPU 上模拟大量粒子。对于“死神特效”这种需要大量粒子爆发、拖尾、碰撞反馈的高表现力效果Niagara 是最合适的选择。1.2 死神特效的效果与动捕场景区别很多人会混淆“角色特效”和“动捕特效”。动捕比如 Full Body IK 解算是把真实动作映射到虚拟角色上而“死神虚化灵压爆发”属于技能视觉特效是把角色状态通过粒子、材质、后期处理反馈给玩家。两者在技术栈上完全不同动捕依赖骨骼网格体和 IK 求解器技能特效依赖 Niagara、材质系统和蓝图事件。Niagara 特效流程 角色技能触发 - 蓝图调用 Niagara 生成特效 - 粒子发射并运动 - 材质渲染叠加混合 - 特效结束时通过回调通知蓝图 - 蓝图恢复角色状态这里的核心关键点是特效不应该只停留在“生成粒子”这一步还要考虑发射器生命周期、参数动态更新、场景交互和性能控制。2. 环境准备与版本说明2.1 引擎版本选择Niagara 在 UE4.26 之后已经比较稳定UE5 之后成为默认粒子系统。本文示例环境以 UE5.3 为准如果你使用的是 UE4.27 或 UE5.0界面和参数位置可能有些不同但整体模块逻辑是一致的。在开始前请先确认以下环境环境项建议配置操作系统Windows 10/11 64 位引擎版本UE5.3 及以上UE5.0 均可项目类型第三人称模板或空白项目显卡要求支持 DX12 / SM5建议 8GB 以上显存素材准备角色骨骼网格体、地面材质如果你的项目是 C 工程Niagara 插件一般默认启用如果是纯蓝图工程需要确保 Niagara 插件开启。打开“编辑 - 插件”搜索 Niagara确认 Niagara、Niagara Core、Niagara Fluids 等模块处于启用状态。2.2 项目结构规划准备工作做好后先在项目中规划好目录Content/ ├─ Characters/ │ └─ Hero/ │ └─ SK_Hero.uasset 角色网格体 ├─ VFX/ │ ├─ Niagara/ │ │ ├─ NS_DeathBurst.uasset 中心爆发发射器 │ │ ├─ NS_ShockWave.uasset 冲击波发射器 │ │ └─ NS_FlameTrail.uasset 火焰拖尾发射器 │ ├─ Materials/ │ │ ├─ M_DarkEnergy.uasset 暗黑能量材质 │ │ ├─ M_FlameTrail.uasset 火焰拖尾材质 │ │ └─ M_ShockWave.uasset 冲击波材质 │ └─ Textures/ │ ├─ T_Noise.uasset 噪波纹理 │ └─ T_FireRamp.uasset 火焰颜色渐变纹理 └─ Blueprints/ └─ BP_DeathAbility.uasset 技能触发蓝图注意并不是所有纹理都需要自己绘制引擎自带的基本噪波Noise就可以满足需求。特效材质制作用的纹理尽量使用公开免费素材或引擎内置算法生成不要直接使用版权不明的下载素材。3. Niagara 核心原理拆解3.1 发射器与模块的关系一个 Niagara 系统Niagara System内部可以包含多个发射器Emitter。每个发射器有自己独立的粒子逻辑和渲染器。发射器内部的执行流程大体如下粒子生成阶段 Spawn - Initialize Particle - 生成位置/速度/颜色/生命周期 粒子更新阶段 Update - 每次 Tick 计算速度、位置、力场、碰撞 粒子渲染阶段 Render - Sprite / Mesh / Ribbon 渲染器调用材质绘制每一个阶段都由若干模块模块Module组成。你添加的模块顺序会影响最终效果例如先设置速度再添加重力和先加重力再设置速度两者表现完全不同。对新手来说最容易犯的错误是看到参数就乱调缺少“模块执行顺序”意识。下图为常见布局Emitter Update发射器更新 ├── Spawn Rate 生成速率 ├── Lifetime 粒子生命周期 ├── Spawn Burst 一次性生成粒子 Particle Update粒子更新 ├── Update Velocity 更新速度 ├── Gravity Force 重力 ├── Drag 阻尼/阻力 └── Scale Color 缩放颜色和透明度3.2 粒子生成模式Continuous 还是 Burst死神灵压爆发讲究“瞬间炸开”的打击感粒子应该在极短时间内大量生成然后向外扩散。所以中心爆发发射器的生成模式建议用 Burst而不是 Continuous。如果用 Continuous粒子会持续补充效果看起来像喷泉用 Burst所有粒子在同一帧生成再配合较大初速度视觉上才有“爆开”的感觉。两者可以结合第一次 Burst 生成大量主粒子随后连续生成少量补充粒子增加细节层次。3.3 粒子渲染器类型Sprite精灵面向相机的面片适合爆炸烟雾、能量冲击波是最常用的渲染器。Ribbon条带由粒子位置连接成条带状适合刀光、闪电、轨迹。Mesh网格体粒子渲染成模型适合金属碎片、骷髅头等有体积感的元素。死神特效中碎片拖尾可以用 Mesh 渲染一个高模碎片如锥体或者直接用 Sprite 加噪波纹理伪造碎片轮廓。若追求体积感Mesh 是首选但性能开销更大需要控制粒子数量。3.4 数据接口与可编程性Niagara 允许你通过 Data Interface 获取场景数据或者通过蓝图设置用户参数User Parameter。典型场景是技能释放时蓝图动态传入爆发中心、爆发半径、伤害值粒子系统根据这些参数实时响应。在 Niagara 中凡是勾选了“User Exposed”的变量都会暴露到系统参数中可以在细节面板或蓝图里直接赋值。这个机制非常灵活但注意变量命名要有规范建议统一前缀比如User.ExplosionCenter、User.ExplosionRadius、User.ExplosionStrength避免项目变大后参数混乱。4. 完整实战制作死神灵压爆发特效4.1 创建 Niagara 系统在 Content Browser 中右键选择“FX - Niagara System”。模板选择画面中选择“New system from a blank template”不要选择带默认发射器的模板因为默认发射器太多干扰项我们手动搭建逻辑更清晰。创建完成后系统默认是空的。我们要往里面添加三个发射器。右键点击系统中的发射器列表区域选择添加发射器Add Emitter - Empty Emitter - New分别命名为E_DeathBurst 中心爆发粒子 E_ShockWave 环形冲击波 E_FlameTrail 火焰拖尾与碎片系统结构如下NS_DeathAbility ├── E_DeathBurst (Sprite渲染) ├── E_ShockWave (Sprite渲染光圈) └── E_FlameTrail (Ribbon渲染 少量Mesh碎片)4.2 编写核心材质材质是所有粒子的视觉基础。对死神特效来说至少要准备两个材质暗黑能量材质带边缘发光效果的黑色烟雾/能量团。冲击波材质从内向外扩散的半透明光圈。先看暗黑能量材质。打开材质编辑器创建材质M_DarkEnergy设置混合模式为 Transparent着色模型为 Unlit双面勾选。材质节点逻辑如下// 思路基础黑色火焰纹理 * 动态发光强度 float2 UV TextureCoordinate[0]; float Noise Texture2DSample(T_Noise, Sampler, UV).r; float DistanceFromCenter distance(UV, float2(0.5, 0.5)); float BodyMask 1.0 - saturate(DistanceFromCenter / 0.4); float EdgeGlow pow(1.0 - saturate(DistanceFromCenter / 0.5), 3.0); float FinalAlpha saturate(BodyMask * Noise EdgeGlow); float3 FinalColor float3(0.02, 0.02, 0.04) EdgeGlow * float3(0.6, 0.08, 0.02) * 2.5; // 输出到材质节点 EmissiveColor FinalColor; Opacity FinalAlpha;这段代码是 HLSL 思路示意在材质编辑器中可以拆成如下节点连接Texture Sample采样噪波纹理。Distance计算 UV 到中心距离。1-x / Power 节点得到边缘发光模拟能量聚集。加法混合让中心暗色、边缘暗红发光。最后输出到 EmissiveColor 和 Opacity。为什么要做边缘发光因为死神灵压爆发的视觉重心是“能量从角色体内向外撕开”边缘应该有能量流动感中心反而是暗色空洞这样才有一种“黑暗吞噬”的压迫感。冲击波材质M_ShockWave就简单一些。核心思路一张径向渐变纹理配合时间偏移做扩散本质上是动态光圈。材质中需要暴露的一个参数为Progress0~1表示冲击波扩散进度。材质函数可写为float Radial 1.0 - smoothstep(Progress - 0.05, Progress 0.05, DistanceFromCenter); float Thickness smoothstep(Progress - 0.1, Progress - 0.05, DistanceFromCenter) * (1.0 - smoothstep(Progress - 0.05, Progress 0.05, DistanceFromCenter)); float Alpha Thickness * 0.8;在 Niagara 里可以通过粒子位置模拟“圆环半径”也可以把材质直接配合一个缩放粒子 Sprite 来实现。实际工程中比较推荐粒子 Sprite 配合 World Position Offset让圆环本身就是一个被拉伸的面片。4.3 配置中心爆发发射器 E_DeathBurst选中 E_DeathBurst在 Niagara 编辑器中调整个模块参数。核心配置如下Emitter Properties ├── Simulation Target: GPU (如果粒子数量超过5000建议GPU3000以下CPU也够用) ├── Local Space: Off └── Determinism: Off Emitter Update ├── Spawn Burst Instantaneous │ ├── Spawn Count: 600 │ └── Spawn Time: 0.0 └── Lifecycle └── Emitter Duration: 1.5s Particle Spawn ├── Initialize Particle │ ├── Lifetime: 0.8~1.5 (随机) │ ├── Color: 从暗红色到黑色渐变 │ └── Color └── Add Velocity ├── Velocity: 随机球形方向 │ ├── Minimum: (0, 0, 100) │ └── Maximum: (0, 0, 300) └── Speed: 500~1500 Particle Update ├── Update Velocity │ ├── Drag: 1.5 │ └── (赋予粒子一种“炸开后被空气阻力减速”的感觉) ├── Gravity Force │ ├── Gravity: -200 │ └── (让粒子有轻微下沉感) └── Scale Sprite Size ├── Sprite Size: 初始30~60逐渐放大200 └── 使用 Curves 控制先急后缓每个参数解释一下Spawn Count 600600 个粒子的量在 CPU 模拟下压力不大GPU 更轻松。如果机器配置低可以先改成 200 个调通逻辑再增长。Speed 500~1500初速度决定了“爆发感”。速度太低粒子就像慢慢飘出来完全没有灵压喷发的冲击力。Drag 1.5阻力让粒子不会无限飞远也不会飞一半突然停住。对死神特效来说粒子需要“先猛冲再减速悬浮消散”。Gravity -200重力值不能太大否则粒子很快落地失去空中弥漫感。粒子更新中还应该加入旋转。在 Particle Update 中添加“Apply Rotation”让每个粒子自带缓慢旋转模拟翻腾的黑雾。Apply Rotation ├── Rotation Rate: 随机 -180~180 度/秒 └── (让粒子运动轨迹更加随机)4.4 配置冲击波发射器 E_ShockWaveE_ShockWave 不需要大量粒子它更像一个动态圆环面片用来给爆炸瞬间增加冲击反馈。Emitter Update 配置Spawn Burst Instantaneous ├── Spawn Count: 1 └── Spawn Time: 0.0粒子生成时初始化一个较大 SpriteInitialize Particle ├── Lifetime: 0.6 ├── Sprite Size: 100 └── Color: 暗红色 Particle Update ├── Scale Sprite Size │ └── 0.6秒从100放大到500 └── Update Color └── Alpha 从1衰减到0在渲染器上选择 Sprite Renderer并指定使用M_ShockWave材质。这里有一个渲染器细节Sprite Renderer 的 Alignment 选项要设为 Camera Facing保证冲击波始终面向摄像机。否则圆形光波在侧视角下会变成椭圆甚至消失。为了让冲击波有“从地面向外推开”的感觉还可以在 Particle Spawn 阶段用“Set Position”配合有一定高度的平面偏移。更简单粗暴的做法是粒子位置在生成时锁定为角色脚下往上 10cm并在 Update 阶段让 Y 轴缩放变化即可。4.5 配置火焰拖尾与碎片发射器 E_FlameTrailE_FlameTrail 是死神特效中表现力最强的部分。它同时包含两类粒子Ribbon 粒子形成从角色身后拖出的黑色灵压火焰轨迹。Mesh 粒子散落的碎片增加体积感和破坏感。先配置 Ribbon 发射器部分。Ribbon 渲染器需要粒子之间保持连续的连接顺序因此粒子生成时要注意以下参数Spawn Per Frame ├── Spawn Rate: 30 └── (每秒30个粒子形成连续条带) Initialize Particle ├── Lifetime: 1.0 ├── Position Offset: 从角色背部向上偏移 └── Color: 暗红色 - 黑色过渡 Particle Update ├── Add Velocity │ ├── 朝向角色前方速度800 │ └── Drag: 2.0 └── Ribbon Width └── 宽度从30渐变到0再添加 Mesh 碎片部分。可以在同一个发射器中多加一个粒子生成器也可以单独再添加一个发射器。为了减小系统复杂度这里放同一个发射器通过 Spawn Burst 生成少量 Mesh 粒子Spawn Burst Instantaneous ├── Spawn Count: 30 └── 粒子渲染器选择 Mesh Renderer Mesh Renderer 设置 ├── Mesh Asset: /Engine/BasicShapes/Cone └── 或者使用自定义碎片模型 Polygon碎片粒子的物理表现最重要的参数Particle Spawn ├── Add Velocity: 球形方向速度800~1800 └── Add Angular Velocity: 角速度600~1200度/秒 Particle Update ├── Gravity Force: -800 ├── Drag: 0.5 └── Collision ├── 启用 Collision ├── Collision Mode: Particle Project └── Restitution: 0.2这样碎片会快速飞散、下坠并在地面弹跳和缓慢弥漫的黑色灵压形成节奏反差。4.6 蓝图调用与参数传递特效最终需要在角色技能触发时播放。新建蓝图BP_DeathAbility在角色手上或者骨骼上放置一个 Niagara 组件也可以在技能蒙太奇通知中调用。推荐使用 Niagara Function Library 动态生成这样无需在场景中预先摆放大量特效组件。在角色的技能触发事件里写如下逻辑这是蓝图节点等价代码的伪代码描述1. 获取角色骨骼插槽位置 Socket_Name hand_r 2. 调用 Spawn System at Location System NS_DeathAbility Location hand_r Socket Location Rotation Character Rotation 3. 获取返回的 Niagara 组件 4. 调用 Set Niagara Variable (Float) Variable Name User.ExplosionRadius Value 600 5. 调用 Set Niagara Variable (Float) Variable Name User.ExplosionStrength Value 1.0 6. 播放完毕后延迟2秒销毁组件如果使用 C对应的接口大致如下// 文件路径Source/YourProject/AbilitySystem/DeathAbility.cpp UNiagaraFunctionLibrary::SpawnSystemAtLocation( GetWorld(), DeathNS, SocketTransform.GetLocation(), SocketTransform.GetRotation(), true, true );C 方法的关键参数说明参数作用WorldContextObject传入 GetWorld()SystemTemplateNiagara 系统资产Location特效生成位置Rotation特效朝向bAutoDestroy特效播放完后自动销毁bAutoActivate生成后自动播放PoolingMethod可指定不池化、自动池化等关于池化Niagara 默认支持系统实例池化频繁生成销毁的技能特效建议开启自动池化避免反复创建销毁带来的性能损耗。在生成时把 PoolingMethod 设为Auto即可如果项目中有明确的多段攻击需求可以手动管理池化。4.7 运行与验证点击 Play 后触发技能预期表现顺序时间现象0.00s中心瞬间爆发600个黑色能量粒子0.02s冲击波圆环从角色中心向外扩散0.10s火焰拖尾沿角色前进方向拖出黑色轨迹0.30s碎片粒子开始下坠并碰撞地面弹跳0.80s中心粒子逐渐消散冲击波消失1.20s所有粒子淡出特效完全结束如果发现中心爆发粒子直接飞出屏幕外面请优先检查 Emitter Update 中的 Initialize Particle 的初速度范围和 Drag 数值。这两者共同决定了粒子的扩散半径。5. 常见问题与排查思路5.1 粒子太亮或全白黑色效果出不来这个问题通常出在材质混合模式或 Bloom 强度上。排查顺序问题现象常见原因解决思路粒子全白材质没设置为 Unlit 或者混合模式不对将 Shading Model 改为 Unlit混合模式改为 Transparent黑色部分亮度太高后期处理 Bloom 影响降低后期处理 Volume 的 Bloom Intensity或材质中把亮部限制在 1.0粒子之间没有叠加混合模式不对材质 Blend Mode 使用 Additive 或 Translucent根据需求选择5.2 粒子数很多但画面里看不到粒子存在但看不到优先检查渲染器是否被遮挡、粒子位置是否为 0、材质 Opacity 是否为 0。排查 Checklist □ Spawn 数量是否为正数 □ Initialize Particle 中位置是否设置了有效值 □ 材质 Opacity 输出节点是否接入 □ Sprite Renderer 的 Material 是否指定 □ 发射器是否被强制隐藏或系统没有自动激活 □ Niagara System 的 Auto Activate 是否开启最常见原因是发射器没有在系统细节面板勾选自动激活或者系统资产未指定素材。很多新手从模板复制发射器时渲染器的 Material 是空的自然什么都看不到。5.3 性能掉帧严重死神特效如果爆发粒子数量过大会明显掉帧。优先确认 Simulation Target场景推荐原因粒子数量小于2000CPU易于调试模块支持更完整粒子数量2000~10000GPU并行计算速度快粒子数量10000以上GPU 优化材质注意 GPU 资源占用碎片 Mesh 粒子数量上限建议控制在 50 以内因为每个 Mesh 粒子的渲染开销远高于 Sprite。特效追求细节可以用少量高表现力 Mesh不要堆大量低质量 Mesh。5.4 冲击波面向不对冲击波旋转方向取决于粒子 Sprite 的 Alignment 和相机朝向。如果冲击波是水平圆环不要使用普通 Sprite 展示。推荐做法是在材质中生成圆环贴图或者把发射器组件跟随角色旋转用世界对齐方式对齐。对齐方式选项 - Camera Facing面向摄像机适合烟雾能量球。 - Velocity Aligned沿速度方向拉伸适合刀光。 - Screen Alignment永远面向屏幕适合 UI 特效。冲击波是一种特殊的存在它需要在世界空间中保持水平但视觉效果又要像三维圆环展开。最简单的实现是粒子使用 World Aligned 并在材质中通过世界位置坐标生成圆环。不过考虑到新手理解成本建议先用 Camera Facing 加“俯视观看”方式验证效果后续再优化。6. 最佳实践与工程建议6.1 参数命名规范Niagara 系统参数会在项目不断变大时变得难以管理推荐下面命名方式User.ExplosionCenter向量 User.ExplosionRadius浮点 User.ExplosionStrength浮点 User.EffectColor线性颜色外层传参时蓝图变量和 Niagara 变量名称要严格区分大小写。Niagara 变量是区分大小写的User.explosionradius和User.ExplosionRadius不是同一个变量一旦写错参数会静默失效特效不会按预期变化也很难排查。建议建立一份团队内的变量命名表或者单独在 Niagara System 中命名空间管理方便美术和程序协作。6.2 材质与粒子分离设计材质的职责是“长什么样”Niagara 的职责是“怎么运动、怎么分布”。不要试图在材质节点里堆大量粒子逻辑不会简化工作流反而让材质变得难以维护。推荐组合材质函数Material Function负责噪声、边缘光、透明度的基础计算。Niagara 模块负责速度、生命、旋转、受力。Renderer只负责选用材质和排列方式。材质函数的好处是可以被多个材质复用。比如死神特效中的“暗黑能量边缘光”函数就可以复用在角色上也可以在 UI 血条特效中使用只用改颜色即可。6.3 性能预算与 LODNiagara 支持 LOD 设置。在发射器属性中可以为远程、近程、远景设置不同的粒子数量和生成率。LOD 设置推荐 - 近距离粒子数量100% - 中距离粒子数量60% - 远距离粒子数量30%关闭碰撞 - 超远距离关闭特效实际项目建议在特效制作阶段就做好 LOD 计划而不是等合入项目后才发现性能超标再来优化。一个 600 粒子 30 碎片的特效在普通场面下还好但如果是 32 人同屏各放一次技能性能压力是指数级增长的。6.4 生命周期管理与对象池技能特效频繁生成销毁如果不做池化GC 压力会很明显。在蓝图调用 Spawn System 时给返回的 NiagaraComponent 设置正确的 Lifecycle。推荐做法特效组件挂在角色上且常驻通过 Activate/Deactivate 控制开关。或者生成后绑定完参数在特效完成事件中主动销毁且开启 Auto Destroy。注意不要手动调用 Destroy 太早否则拖尾粒子会被强制截断出现“一刀切”的视觉硬伤。要监听 Niagara Component 的 Completed 事件等特效播放完毕后再销毁。6.5 版本兼容与迁移Niagara 在 UE5 不同小版本之间偶尔会出现模块默认值变化建议关键特效制作完立即保存为独立资产并备份版本。升级引擎时先在副本项目中打开特效确认参数不报错再合入主干。不要直接跨大版本升级特效项目除非有明确的迁移计划。UE4.27 升级到 UE5 后部分材质节点默认值会变化例如 Translucency 的默认扭曲强度不同。遇到画面偏差时优先检查材质中与 Scene Texture、Distortion 相关的节点。7. 总结与学习路线通过这个项目你应该掌握了 Niagara 特效由“发射器 模块 渲染器 材质”组成的基本模型理解了 Burst 生成模式对爆发类特效的意义以及如何用参数、材质函数、蓝图调用串联起一个完整技能表现。接下来可以继续深入的方向Niagara 的 GPU 模拟尝试把中心爆发改为 GPU 模拟压到 10000 粒子观察性能和表现差异。自定义 HLSL 模块现在你可能还是用现成模块下一步可以在 Particle Update 中写 Custom HLSL实现螺旋上升、旋涡聚集等复杂运动。Data Interface 与场景交互尝试让粒子检测地面高度、碰撞物体甚至根据场景遮挡关系形成阴影。与 Gameplay 系统联动把特效和伤害范围、技能判定、音效、镜头震动串在一条事件链里。最后建议在这个阶段不要急着把特效做得花里胡哨。先把一套特效的“节奏”调准确例如“瞬间爆发 - 减速弥漫 - 碎片落地 - 完全消散”的时间比例比单纯堆粒子数量重要得多。死神特效的压迫感很大程度来自爆发瞬间的速度和后续减速度形成的反差花时间调好这两个值效果会立刻上一个台阶。如果本文对你有帮助可以收藏备用下次做角色技能特效时直接参考这套流程。遇到 Niagara 相关问题也欢迎在评论区留言交流。