1. 项目概述为什么选择Niagara制作动态烟雾在UE5里做特效尤其是像烟雾、火焰、灰尘这类需要大量粒子动态变化的模拟Niagara系统是绕不开的核心工具。相比老牌的Cascade粒子系统Niagara提供了更强大的可编程性和模块化控制让你能从底层逻辑开始“手搓”一个完全符合你想象的效果。这次要做的“会飘的烟雾”就是一个典型的Niagara应用场景——它不仅仅是粒子简单的上升还涉及到速度、密度、形状、光照交互特别是半透明材质等一系列复杂参数的协同工作。很多刚接触UE5特效的朋友可能会被蓝图节点和一堆参数吓到觉得无从下手。这个教程的目的就是把这些复杂的流程拆解成一步一步可执行的“保姆级”操作。我会从创建一个空的Niagara系统开始带你配置发射器、编写粒子行为逻辑、制作关键的双层半透明材质最后把所有蓝图节点串联起来形成一个完整、自然飘动的烟雾效果。过程中涉及到的每一个参数调整我都会解释清楚“为什么这么调”以及调错了会有什么后果。无论你是想为你的独立游戏增加氛围还是为影视项目制作特效资产这套方法都能给你一个扎实的起点。2. 核心思路拆解双层粒子与材质融合一个看起来真实的烟雾绝不是一堆白色半透明球体乱飞。它的核心在于“层次感”和“动态细节”。我们的实现思路可以分解为两个核心部分2.1 粒子系统的双层结构单层粒子很难模拟出烟雾内部疏松外部相对密实、并且边缘有细微消散的感觉。因此一个成熟的方案是使用两个Niagara发射器Emitter协同工作内层核心粒子负责构成烟雾的主体质量和上升运动。这层粒子数量相对较多生命周期较长运动相对稳定是烟雾的“骨架”。外层细节粒子负责模拟烟雾边缘的絮状、撕裂感和消散细节。这层粒子数量较少生命周期短运动更加随机添加更多的湍流和噪声力并且尺寸通常更小。它们从内层粒子中“剥离”出来增强视觉丰富度。两层粒子使用相同或相似但参数不同的材质通过叠加产生丰富的体积感。2.2 材质的关键动态不透明度与光照响应烟雾材质的核心是“半透明”着色模型。但直接用一个固定不透明度的半透明材质效果会很“塑料”。我们需要让材质“活”起来基于深度的边缘淡出利用像素深度Pixel Depth或到摄像机距离让烟雾粒子在远离中心或边缘处逐渐透明化模拟自然的消散。噪声扰动在材质中使用噪声纹理如Perlin Noise来扰动不透明度Alpha通道打破均匀感制造出烟雾内部疏密不均、棉絮状的细节。光照与阴影对于半透明物体简单的光照模型可能不够。我们需要考虑体积光照Volumetric Lighting的近似或者至少让烟雾能对场景主光源产生柔和的响应比如在逆光时能显出亮边。这通常通过材质中的自定义光照计算或后期处理材质来实现。注意在UE5中使用“半透明”着色模型对性能影响较大尤其是在移动端。在项目初期就需要评估性能预算。对于性能敏感的场景可以考虑使用“叠加”Additive着色模型模拟轻烟或者使用Niagara的粒子网格体Mesh Particles配合顶点动画材质来用更少的粒子表现体积但这属于更进阶的优化技巧了。3. 从零搭建Niagara烟雾系统现在我们进入实操环节。打开你的UE5项目跟着步骤一步步来。3.1 创建Niagara系统与发射器在内容浏览器中右键选择“FX - Niagara System”。命名为NS_Smoke。双击打开这个新创建的Niagara系统。你会看到一个空的系统视图。在系统视图内右键选择“Emitter - Empty Emitter”。我们将创建两个发射器先创建第一个命名为E_Smoke_Core核心烟雾。重复步骤3创建第二个发射器命名为E_Smoke_Wisp烟丝细节。然后将E_Smoke_Wisp拖拽到E_Smoke_Core的下方这表示细节发射器可以继承或受核心发射器的影响虽然本次不涉及复杂继承但保持结构清晰是好习惯。3.2 配置核心烟雾发射器 (E_Smoke_Core)选中E_Smoke_Core在细节面板中我们需要添加并配置一系列模块。发射器更新Emitter Update添加“Spawn Burst Instantaneous”模块。设置Spawn Count为 50。这决定了同时存在的最多粒子数。你可以根据性能调整。粒子生成Particle Spawn初始位置Initialize Particle默认存在。将Location设置为{0,0,0}Sprite Size初始值设为(15, 15)。烟雾粒子我们通常使用面向摄像机的四边形Sprite而不是网格体。初始生命周期Lifetime添加模块设置Lifetime为8.0到12.0之间的一个随机范围例如 Min8, Max12。这样粒子不会同时消失。初始大小Size添加模块设置Size为(10, 10)到(25, 25)的随机范围。让烟雾有大小变化。初始颜色Color添加模块设置初始颜色为浅灰色例如 RGB 0.9, 0.9, 0.9Alpha不透明度初始值设为0.3。记住颜色最终会与材质相乘。粒子更新Particle Update力Forces这是让烟雾“飘”起来的关键。添加“Add Velocity”模块。设置一个向上的基础速度例如(0, 0, 50)。这提供了主要的上升力。湍流Turbulence添加“Vortex Force”或“Noise Force”模块。以“Noise Force”为例设置一个较低的强度如Magnitude30和较高的频率如Frequency0.5。这会给粒子添加随机的、类似布朗运动的力模拟空气扰动。阻力Drag添加“Drag”模块设置系数为0.5。这能防止粒子速度无限增加让运动更自然有“厚重感”。颜色随时间变化Color over Life添加模块。我们需要让粒子在生命末期淡出。在曲线编辑器里将Alpha通道的曲线设置为从起始值约0.3到生命终点值0的一条平滑下降曲线。RGB颜色也可以微调例如在生命中期加入一点点暖色调模拟光透射。大小随时间变化Scale Sprite Size over Life添加模块。让粒子在出生后稍微变大然后在消亡前缩小。曲线可以设置为0秒时大小倍数为12秒时到1.36秒时回到1生命终点时到0.1。这模拟了烟雾扩散和最终消散的过程。3.3 配置烟丝细节发射器 (E_Smoke_Wisp)选中E_Smoke_Wisp它的配置思路是“更少、更小、更短命、更随机”。发射器更新同样使用“Spawn Burst Instantaneous”但Spawn Count设为 15。粒子生成Lifetime: 设为3.0到5.0。Size: 设为(3, 3)到(8, 8)。Color: 颜色可以更白一些RGB 1.0, 1.0, 1.0初始Alpha设为0.15更淡。粒子更新“Add Velocity”上升速度可以比核心层稍快或不规则例如Z 30 Rand(-20, 20)。“Noise Force”这里的强度可以加大比如Magnitude80Frequency1.0让细节粒子的运动更加飘忽不定。“Drag”系数可以小一些如0.3让它们更轻盈。颜色和大小随时间变化其Alpha淡出曲线应该更陡峭生命周期前半段就快速变透明。大小变化曲线也可以更随机。3.4 系统级设置与预览回到 Niagara 系统层级点击左上角的系统名称NS_Smoke。在“系统属性”中确保“Fixed Bounds”固定边界被勾选并设置一个合理的边界框大小如200x200x400。这有助于UE5的裁剪和LOD计算对性能很重要。将系统拖入关卡点击工具栏的“运行”或“模拟”按钮你应该能看到一个初步的、会动起来的白色粒子团。但现在它还缺乏质感接下来我们为它注入灵魂——材质。4. 制作烟雾的半透明材质在内容浏览器中右键选择“Material”命名为M_Smoke。4.1 材质基础设置双击打开材质M_Smoke。在细节面板中将“材质域”设置为“表面”“混合模式”设置为“半透明”。“着色模型”选择“无光照”是一个简单的开始因为它不受场景光照影响颜色完全由我们控制效果稳定。但为了更真实我们选择“次表面”着色模型并勾选“双面”。次表面模型能更好地模拟光线在介质内部的散射适合烟雾、蜡、皮肤等。将“不透明度”引脚连接到一个标量参数命名为Base Opacity默认值设为0.8。这只是基础值我们会用复杂的计算覆盖它。4.2 构建动态不透明度网络这是材质最核心的部分。思路是基础纹理 深度衰减 噪声扰动。基础纹理采样使用一个柔和、边缘模糊的圆形渐变纹理或噪声纹理作为基础。你可以使用引擎自带的T_Noise或者自己导入一张云噪纹理。用TextureSample节点采样将其RGB输出或单独取R通道连接到Opacity引脚先看看基础效果。深度衰减Distance Fade为了让粒子在远离其中心或靠近边缘时淡出我们需要计算。添加PixelDepth节点获取当前像素的深度。但更常用的方法是使用SphereMask节点。假设粒子是球形的我们可以用物体空间位置Object Position计算到粒子中心的距离然后用SphereMask创建一个从中心不透明度高到边缘不透明度低的渐变。将这个渐变结果与基础纹理采样结果相乘。噪声扰动添加第二个噪声纹理最好与基础纹理不同频率采样后通过Power节点增强对比度然后与上一步的结果再次相乘。这会在烟雾表面增加破洞和疏密变化。你可以用一个Time节点乘以一个速度参数再连接到噪声纹理的UV偏移上让噪声扰动动态变化模拟烟雾的缓慢翻滚。最终控制将上述复杂的计算结果最后乘以一个Opacity Multiplier参数默认0.5再连接到材质的不透明度引脚。这样我们可以在实例中动态调整整体透明度。4.3 添加简单光照响应可选但推荐为了让烟雾能与场景互动我们做一个简单的边缘光。使用Fresnel节点。将其输出视角与法线夹角通过一个Power节点控制边缘宽度再通过Multiply乘以一个颜色如淡蓝色和强度参数。将这个结果用Add节点叠加到材质的“自发光颜色”引脚上。这样在视角与烟雾表面切线方向看过去时它会有一圈淡淡的光晕模拟逆光透射效果。4.4 创建材质实例为了便于在Niagara中动态调节参数而不必重新编译材质我们创建材质实例。在M_Smoke上右键选择“创建材质实例”命名为MI_Smoke。回到Niagara系统分别为两个发射器的“Renderer - Sprite Renderer”模块下的“Material”参数指定这个MI_Smoke材质实例。现在运行你的烟雾应该有了基本的质感和动态变化。5. 完整蓝图节点串联与参数动态控制虽然大部分逻辑在Niagara模块里完成了但我们有时希望通过关卡蓝图或Actor蓝图来动态控制烟雾的某些属性比如生成位置、密度、颜色等。这里给出一个典型的蓝图控制示例。5.1 创建烟雾生成器蓝图新建一个蓝图类父类选择Actor命名为BP_Smoke_Spawner。在组件面板添加一个“Niagara Component”并指定其Niagara System Asset为我们刚创建的NS_Smoke。在事件图表中我们通常会在BeginPlay事件时激活粒子系统。5.2 暴露并动态调节Niagara参数Niagara的强大之处在于可以在蓝图中实时访问和修改几乎任何参数。首先需要在Niagara系统内部将参数“暴露”为用户参数。例如在E_Smoke_Core的发射器属性中找到Spawn Count点击其右侧的小菱形图标选择“Promote to User Parameter”命名为User.CoreSpawnCount。对颜色、初始大小等参数做同样操作。在蓝图BP_Smoke_Spawner中选中 Niagara 组件在细节面板的“Niagara”分类下你会看到暴露出来的用户参数列表。你可以拖拽这些参数到事件图表中用Set Niagara Variable节点在运行时修改它们。例如你可以连接一个时间轴Timeline来循环改变User.CoreSpawnCount制造烟雾一阵浓一阵淡的效果。或者监听玩家的距离当玩家靠近时通过Set Niagara Variable (Linear Color)节点将烟雾颜色调深。5.3 一个实用的动态蓝图示例假设我们想让烟雾在生成时根据生成点的位置比如靠近火焰改变初始颜色。在Niagara中将粒子生成时的Initial Color模块的输入链接到一个用户参数比如User.StartColor。在蓝图BP_Smoke_Spawner中在生成烟雾例如调用Activate后立即使用Set Niagara Variable (Linear Color)节点将User.StartColor设置为一个计算好的颜色比如从火焰Actor读取光色。你甚至可以在Niagara中使用粒子事件Particle Events让核心粒子在死亡时触发生成一组新的细节粒子实现更复杂的链式反应。这需要在Niagara中设置“事件生成器”和“事件接收器”并在蓝图中发送事件。实操心得蓝图与Niagara的联动是UE5特效艺术家的必备技能。一开始可能觉得复杂但掌握后能实现极其动态和交互性的效果。一个调试技巧是在Niagara预览窗口打开“调试”信息可以实时看到粒子属性位置、速度、生命周期等的数值变化这对于理解粒子行为和排查问题至关重要。6. 性能优化与常见问题排查一个好看的烟雾特效如果让帧率暴跌那就失去了意义。以下是关键的优化点和问题解决方法。6.1 性能优化要点粒子数量与预算这是最直接的影响因素。在Niagara系统属性里设置“Max Particles”最大粒子数预算。对于烟雾核心层50-100细节层15-30是一个不错的起点。在远处可以使用LOD细节层次系统自动减少粒子数量和模拟质量。材质复杂度半透明材质每帧每个像素都会计算非常消耗。避免在烟雾材质中使用过多的高频噪声纹理采样和复杂的数学运算。尽量使用材质实例参数在运行时调整而不是在材质内做动态计算。考虑将一些静态计算“烘焙”到纹理中。渲染状态切换确保烟雾材质使用的纹理尽可能合并到一张图集Texture Atlas中减少GPU的纹理采样次数。在Niagara的Sprite渲染器中正确设置图集。模拟开销减少物理力计算的频率。在发射器属性中可以降低“Simulation Target”模拟目标如从60FPS降到30FPS或者使用“Delta Time”缩放来放慢模拟速度这对远处或非重点的烟雾很有效。后期处理屏幕空间的半透明渲染特别是多重半透明重叠开销大。如果场景中有大量烟雾谨慎使用景深、运动模糊等后期效果它们会显著增加半透明通道的渲染负担。6.2 常见问题速查表问题现象可能原因排查与解决思路烟雾不显示或全黑1. 材质着色模型或混合模式错误。2. 粒子渲染器未指定材质。3. 粒子初始大小/缩放为0。1. 检查材质是否为“半透明”模式基础颜色/自发光是否有输出。2. 检查Niagara中Sprite Renderer的Material参数是否指定。3. 在粒子生成模块检查Size初始化值。烟雾边缘有硬边或锯齿1. 材质不透明度过渡太生硬。2. 粒子纹理本身边缘锐利。3. 缺少抗锯齿TAA支持。1. 在材质中使用SmoothStep或更柔和的曲线处理不透明度边缘。2. 使用边缘模糊的烟雾纹理。3. 在项目设置中确保 Temporal AA 开启。对于半透明可以尝试调整“Translucency Lighting”设置。烟雾运动僵硬像气球1. 缺少随机力噪声/湍流。2. 速度恒定缺少加速度变化。3. 阻力Drag系数太低。1. 在粒子更新阶段添加“Noise Force”或“Vortex Force”模块并调整强度和频率。2. 尝试使用“Curve”来驱动速度或加速度而非恒定值。3. 增加Drag系数让粒子有“重量感”。性能消耗过高GPU1. 粒子数量过多。2. 材质过于复杂指令数高。3. 半透明重叠过度。1. 使用Niagara的LOD系统和粒子预算控制。2. 打开材质编辑器查看左下角的指令数统计。简化网络减少纹理采样和复杂数学节点。3. 优化美术效果减少不必要的重叠。考虑使用粒子排序Sort Mode为“View Depth”来优化渲染顺序。蓝图无法控制参数1. 参数未在Niagara中提升为用户参数。2. 蓝图节点中参数名称或类型不匹配。3. Niagara组件未正确引用系统。1. 回到Niagara确认参数已“Promote to User Parameter”。2. 检查Set Niagara Variable节点中的变量名是否与Niagara中完全一致包括命名空间如User.前缀。3. 确保蓝图中的Niagara组件加载了正确的NS_Smoke系统。6.3 调试技巧实录使用Niagara调试视图在Niagara系统编辑器的预览视口点击左上角的“调试”按钮可以开启多种调试覆盖层如“Particle Color”、“Particle Age”、“Particle Velocity”等。这能让你直观地看到每个粒子的属性分布快速定位是哪个模块的行为不符合预期。逐模块禁用如果效果异常可以尝试在发射器堆栈中逐个禁用点击模块旁边的眼睛图标粒子更新阶段的模块。例如禁用“Noise Force”后如果运动正常了问题就出在噪声力的参数设置上。检查材质节点预览在材质编辑器中按住键盘上的M键并点击任何节点可以在左侧的预览窗口中实时看到该节点的输出结果。这是调试复杂材质网络的神器确保每一步计算都符合你的预期。最后特效制作是一个反复迭代和观察的过程。最好的参考就是现实世界。多观察真实烟雾的形态、运动规律和光影变化将这些观察转化为Niagara中的参数调整。这套从系统搭建、材质制作到蓝图控制的完整流程为你提供了一个强大的工具箱你可以在此基础上通过调整噪声纹理、力场参数、颜色曲线创造出火焰上的黑烟、蒸汽、迷雾乃至魔法气息等千变万化的效果。记住所有复杂的特效都是由这些基础的模块和原理组合而成的理解每一步背后的“为什么”比记住具体的参数值更重要。