UE5 动态天气系统:雨、雪、雾的 Niagara 实现方案

上周有位学员在群里问:“老师,我做了个开放世界场景,但下雨效果一直像塑料粒子砸在脸上,完全没有真实感。如何用Niagara做出能随风飘、能落地溅起水花的雨?”这个问题其实戳中了很多特效师的痛点——UE5自带的天气系统虽然基础,但想做出电影级效果,必须自己动手用Niagara和材质系统来调。

今天我们就从雨、雪、雾三个核心天气类型入手,拆解一套完整的Niagara实现方案。全程基于UE5.3版本,所有参数都会标注具体数值,你可以直接拿去用。

一、雨:从“塑料粒子”到“真实暴雨”

1.1 基础粒子系统搭建

打开Niagara编辑器,新建一个`Niagara System`,选择`Empty`模板。在`Emitter Properties`中设置:

  • Spawn Rate: 5000(密集暴雨可调至8000-10000)
  • Lifetime: 0.8-1.2秒(雨滴从出现到消失的时间,根据场景深度调整)
  • Initial Velocity: (0, 0, -800) ~ (0, 0, -1200) 加随机偏移
  • 关键点在于粒子形状。不要用默认的圆点,改为长条形。在`Render`模块中添加`Sprite Renderer`,然后创建一个材质:

    材质节点:

  • 用`Texture Coordinate`连接`Panner`,UV偏移速度设为(0, -0.5)
  • 用`Noise`节点生成随机条纹,混合透明度
  • 最终输出到`Base Color`和`Opacity Mask`
  • 这样每个粒子看起来就是一条细长的雨丝。为了让雨丝有方向性,在`Particle Spawn`模块中给`Sprite Facing`绑定`Velocity`向量,粒子会始终朝向运动方向。

    1.2 风场与湍流

    真实世界的雨不会垂直落下。在`Update`模块中添加`Force`节点:

  • Wind Force: (50, 30, 0) 模拟侧风
  • Turbulence: 用`Perlin Noise`生成随机扰动,强度0.2-0.5
  • 具体操作:在`Particle Update`中添加`Add Velocity`,输入`Wind Force`。再添加一个`Noise`节点,连接到`Add Velocity`的`Scale`参数。这样雨滴会随风摆动,产生真实感。

    1.3 地面交互:水花与涟漪

    这是提升真实感的关键。当雨滴落到地面时,需要触发次级粒子(水花)。

    在`Niagara Emitter`中新建一个`Event Handler`:

  • Event Name: `OnDeath`
  • Execution Mode: `Spawn Particles`
  • Spawn Count: 3-5
  • 然后新建一个`Sub Emitter`,专门负责水花粒子:

  • Lifetime: 0.2-0.4秒
  • Initial Size: 0.5-1.0
  • Color: 白色到透明渐变
  • 水花粒子的运动用`Drag`模拟阻力,让它们快速扩散消失。为了让水花只在“地���”触发,需要检测碰撞。在`Emitter`的`Collision`模块中:

  • Collision Mode: `Physics`
  • Restitution: 0.1
  • Friction: 0.8
  • 当粒子碰撞到`World Static`时,触发`OnCollision`事件,再生成水花粒子。注意要勾选`Generate Collision Events`。

    雨滴粒子与地面水花

    1.4 性能优化建议

    不要直接给每个雨滴开碰撞检测,那是性能灾难。用屏幕空间方法:

  • 在`Render`模块中开启`Sort Order`,让近处粒子先绘制
  • 使用`LOD`:距离相机超过50米的雨滴,降低Spawn Rate至2000
  • 水花粒子使用`Pool`模式,避免频繁创建销毁
  • 二、雪:从“棉絮”到“暴风雪”

    2.1 雪花粒子基础

    雪和雨的核心区别在于:雪是缓慢旋转、轻盈飘落的。新建一个Niagara系统,参数调整:

  • Spawn Rate: 3000(大雪可到5000)
  • Lifetime: 3-5秒(飘落时间长)
  • Initial Velocity: (0, 0, -100) ~ (0, 0, -200) 速度慢
  • 雪花的形状用六边形纹理。在材质中:

  • 用`Texture Sample`导入雪花贴图(网上找六边形透明PNG)
  • 添加`Rotate`节点,角度绑定到粒子的`Rotation`属性
  • 旋转速度随机化:0.5-2转/秒
  • 2.2 旋转与浮力

    雪的飘落不是直线,而是摇摆。在`Particle Update`中添加:

  • Angular Velocity: 随机值,范围(-3, 3) 弧度/秒
  • Drag: 0.1-0.3(空气阻力,让雪更轻盈)
  • Buoyancy: 用`Sine`函数生成垂直方向的波动,幅度0.5
  • 具体操作:创建一个`Custom`节点,输入`Engine.Time`,输出`sin(Time 2) 0.5`,连接到`Particle Position`的Z轴偏移。这样雪花会上下起伏。

    2.3 积雪效果

    雪落到地面后,应该堆积起来。这需要用材质参数集虚拟纹理。这里提供一个简单方案:

    在场景中放置一个`Post Process Volume`,开启`Enable`。然后创建材质`M_SnowAccumulation`:

  • 用`World Position`计算高度
  • 用`Scene Depth`检测地面距离
  • 当距离小于阈值时,混合白色覆盖层
  • 更高级的做法是用`Runtime Virtual Texture`(RVT)记录雪的高度。在`Landscape`上绘制RVT,然后Niagara粒子碰撞时,将位置写入RVT,形成动态积雪。但这需要额外设置,适合大型项目。

    雪花飘落与地面积雪

    三、雾:从“平面遮挡”到“体积感”

    3.1 基础雾效设置

    UE5自带的`Exponential Height Fog`可以快速生成雾,但它是均匀的。要做出动态雾,用`Niagara`生成体积雾粒子

    新建Niagara系统,使用`GPU Sprites`模式(性能更好):

  • Spawn Rate: 2000(密度越高越真实)
  • Lifetime: 5-10秒
  • Initial Size: 50-200(大粒子模拟雾团)
  • 材质关键:用`Noise`生成云状纹理,透明度随视角变化。在材质中:

  • 用`Camera Vector`计算粒子与相机的距离
  • 透明度 = `1 – saturate(distance / MaxDistance)`
  • 颜色用蓝色调(R:0.8, G:0.9, B:1.0)
  • 3.2 动态流动

    雾会随风流动,形成层次感。在`Particle Update`中添加:

  • Velocity: 用`Vector Field`或`Noise`生成方向场
  • Scale: 随时间增大(雾团扩散)
  • Opacity: 随时间衰减
  • 更真实的方法是使用3D Noise纹理。在材质中采样3D Noise,根据粒子位置和时间偏移,生成流动效果。这需要导入一个3D Noise贴图(32x32x32,RGB通道存储XYZ向量)。

    3.3 与场景交互

    雾应该被场景物体“推开”。用`Distance Field`实现:

  • 在`Particle Spawn`中,采样场景的`Distance to Nearest Surface`
  • 如果距离小于粒子半径,则偏移位置
  • 操作步骤:
    1. 开启`Project Settings -> Rendering -> Generate Mesh Distance Fields`
    2. 在Niagara的`Particle Spawn`中添加`Query Distance Field`节点
    3. 输出到`Particle Position`的偏移

    这样雾粒子会绕过建筑物,产生真实的流体感。

    体积雾与场景交互

    四、系统整合与性能调优

    4.1 天气切换逻辑

    用`Blueprint`控制三个Niagara系统的开关与参数过渡:

  • 创建`Actor`,包含三个`Niagara Component`
  • 用`Timeline`或`Lerp`实现参数平滑过渡(如雨量从0到5000)
  • 用`Event Dispatcher`触发天气变化事件(如闪电、雷声)
  • 4.2 性能预算

    在`Project Settings -> Niagara`中设置:

  • Max Particle Count: 50000(总粒子数上限)
  • System Pool Size: 10(预分配系统数量)
  • GPU Compute: 开启(雨和雪用GPU加速)
  • 建议:

  • 雨:8000粒子(CPU模式)
  • 雪:4000粒子(CPU模式)
  • 雾:2000粒子(GPU模式)
  • 4.3 常见坑点

  • 粒子闪烁:检查`Sort Order`和`Depth Test`,关闭`Translucency Sort Priority`的自动排序
  • 性能突然下降:检查`Collision`是否全开,改用`Event Handler`触发
  • 雾穿透物体:调整`Distance Field`的采样精度,或增加粒子密度
  • 五、总结与学习建议

    这套方案覆盖了雨、雪、雾三大天气类型的Niagara实现,核心思路是用粒子模拟自然现象,而不是依赖引擎内置效果。关键点在于:
    1. 材质决定外观:雨丝的长条纹理、雪花的六边形、雾的Noise
    2. 物理交互提升真实感:碰撞产生水花、积雪、雾绕建筑物
    3. 性能与效果的平衡:用LOD、GPU模式、事件触发优化

    建议你从开始练手,因为它最直观,也最容易看到效果。完成后,尝试在同一个场景中同时运行雨和雾,观察它们的交互。最后,挑战暴风雪场景——结合雪、强风、低能见度雾。

    如果想深入,可以研究Niagara的Data Interface,比如用`Grid2D`存储雨滴撞击地面的涟漪数据,或者用`Vector Field`控制风的流向。这些是高级用法,但能做出令人惊叹的效果。

    常见问题 FAQ

    Q1:为什么我的雨滴看起来像一条条白线,没有透明感?
    A:检查材质的`Opacity Mask`是否使用了噪声或渐变纹理。另外,`Blend Mode`要设为`Translucent`,`Shading Model`选`Unlit`。如果使用`Sprite Renderer`,确保`Opacity Source Mode`为`From Texture Alpha`。

    Q2:雪花的旋转速度怎么控制?
    A:在`Particle Spawn`中设置`Rotation`的初始值,然后在`Particle Update`中通过`Angular Velocity`驱动。用`Random Range`生成-3到3的弧度值,每秒旋转角度 = 速度 × 时间。注意单位是弧度,360度=2π。

    Q3:雾的粒子在相机移动时出现闪烁,怎么解决?
    A:这是常见的排序问题。在`Niagara Renderer`中,将`Sort Mode`设为`Sort By Distance`,并开启`Sort By Distance Range`。另外,在材质中给透明度添加一个随机偏移(0.1-0.3),避免完全透明时闪烁。

    Q4:如何让雨只在特定区域下?
    A:用`Niagara`的`Volume`发射器。创建一个`Box Volume`,设置`Spawn Volume`为`Box`,并调整大小。或者在`Blueprint`中根据玩家位置动态开关系统,用`Distance Check`控制Spawn Rate。

    Q5:性能太差,有什么快速优化方法?
    A:首先降低`Spawn Rate`到3000-5000。其次,关闭`Collision`,改用`Event Handler`在固定高度触发水花。最后,将雨和雪改为`GPU Sprites`模式,雾保持CPU模式。如果还卡,用`Level of Detail`(LOD)在远距离降低粒子密度。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。