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

上周有个学员在群里发了一个视频片段——他的开放世界场景里,角色行走时,雨水穿过树叶落在地面,雾气从山谷升起,然后随着时间推移,雨逐渐变成雪。他困惑地说:“我用了蓝图里的天气系统,但雨滴效果太假,雪片像纸片,雾直接是半透明方块。” 这个问题很典型:很多人用 UE5 默认的粒子系统或简单的材质模拟天气,但结果往往缺乏真实感。

实际上,UE5 的 Niagara 系统完全可以实现高度动态、可交互的天气效果。今天我们就从雨、雪、雾三个核心案例入手,拆解具体操作步骤和参数设置。这些方案已经在我参与的几个商业项目中验证过,效率足够支撑开放世界场景。

一、雨:从“瀑布”到“丝线”的 Niagara 粒子系统

默认的 Cascade 粒子做雨,粒子容易变成“白色光点”或“透明方块”。Niagara 的优势在于,我们可以用 Ribbon Renderer(带状渲染器)让雨滴变成连贯的丝线,再用 CPU 模拟 计算下落与碰撞。

1.1 创建基础雨 Niagara 系统

1. 打开 Content Browser,右键 → Effects → Niagara System → 选择 Empty(不要用模板,模板的默认参数不适合雨)。
2. 在 Emitter 属性中,将 Simulation Target 设为 CPU(CPU 模拟便于处理碰撞和大量粒子,GPU 适合更复杂的特效但碰撞计算较慢)。
3. 添加 Spawn Rate 模块,设置每秒生成粒子数量:`5000-8000`(根据场景范围调整,室内场景可降低到 2000)。

1.2 粒子生命周期与运动

关键参数在 Particle State 模块:

  • Lifetime:0.8-1.2 秒(雨滴从出现到落地的时间,太短会显得“瞬移”,太长会拖尾)
  • Initial Velocity:Z 轴设为 `-800 ~ -1200`(单位 cm/s,模拟重力加速度,注意负值向下)
  • Drag:0.01(空气阻力,雨滴速度快但阻力小,设为 0.01 即可)
  • 1.3 Ribbon Renderer 设置

    这是雨滴丝线化的核心:
    1. 在 Renderer 选项卡中,添加 Ribbon Renderer
    2. Width Mode:选择 From Size(从粒子大小控制宽度)。
    3. Ribbon Width:0.1-0.3 cm(太宽会像面条,太窄会消失)。
    4. Sort ModeSort by Age(按年龄排序,避免带状交叉错乱)。

    配图1:Ribbon Renderer 参数面板
    Niagara Ribbon Renderer Settings

    1.4 碰撞与地面交互

    雨滴落地后需要产生水花或涟漪,这需要 Collision 模块:
    1. 添加 Collision 模块,选择 World Collision
    2. Collision ModeSurface(基于表面碰撞,而不是简单的位置检测)。
    3. Friction:0.1(雨滴落地后不会弹跳,所以摩擦力设为接近 0 反而更真实)。
    4. 在 On Collision 事件中,生成一个子发射器(Sub Emitter)来模拟水花。创建一个简单的 Niagara 系统,只包含 5-8 个粒子,生命周期 0.2 秒,初始速度向上 200 cm/s,然后绑定到雨滴的碰撞事件。

    注意:碰撞检测会消耗性能,如果场景中雨滴数量超过 10000,建议只对玩家视野内的粒子启用碰撞,或者使用 Distance Culling 模块。

    二、雪:飘落与堆积的材质技巧

    雪的难点在于“飘落轨迹”和“堆积效果”。Niagara 的 Noise 模块可以模拟雪的随机飘落,而堆积则需要结合 Landscape 材质。

    2.1 雪的 Niagara 粒子系统

    1. 新建一个 Niagara 系统,同样选择 CPU 模拟。
    2. Spawn Rate:2000-4000(雪比雨轻,粒子数量不需要太多,太多会像暴风雪)。
    3. Particle State
    Lifetime:3-5 秒(雪下落慢,需要更长生命周期)
    Initial Velocity:Z 轴 `-50 ~ -150`(比雨慢得多,X 和 Y 轴加随机值 `-30 ~ 30` 模拟风)
    4. Drag:0.1-0.2(雪的空气阻力大,数值更高)

    2.2 飘落轨迹:Noise 模块

    这是雪的核心效果:
    1. 在 Particle Update 阶段添加 Noise 模块。
    2. Noise ModePerlin Noise(柏林噪声,生成平滑随机运动)。
    3. Frequency:0.5-1.0(频率越低,飘落路径越平滑;频率高会抖动得像苍蝇)。
    4. Amplitude:X 和 Y 轴设为 `50-100` cm,Z 轴设为 `0`(雪在水平方向飘,垂直方向保持下落)。
    5. Apply ModeAdd(在原有速度基础上叠加噪声偏移)。

    2.3 渲染与材质

    雪片不能直接用 Ribbon Renderer,因为雪是片状。使用 Sprite Renderer
    1. 创建一个材质(Material),Blend Mode 设为 Translucent
    2. 使用一个圆形渐变纹理(Texture),边缘羽化。核心参数:
    Opacity Mask:连接纹理的 Alpha 通道
    Opacity:0.6-0.8(半透明,模拟雪片的光泽)
    Roughness:0.3-0.5(雪不是完全光滑,有漫反射)
    3. 在 Niagara 的 Renderer 中,将材质指定为这个自定义材质。

    配图2:雪粒子材质节点设置
    Snow Particle Material Blueprint

    2.4 堆积效果:Landscape 材质技巧

    粒子本身不会堆积,但可以通过 Landscape 材质实现视觉上的积雪:
    1. 打开 Landscape 材质,添加一个 Layer Blend 节点。
    2. 创建一个 Snow Layer,使用 HeightLerp 节点控制积雪范围(例如海拔 800 以上开始积雪)。
    3. 关键:在 Niagara 系统中,通过 Parameter Map 输出雪粒子数量密度到 Landscape 的材质参数集(Material Parameter Collection)。在蓝图中,每帧统计视野内雪粒子的位置,更新到参数集,Landscape 材质根据密度值混合雪层纹理。

    这个方法比单纯用静态网格体(如雪堆)更动态,但需要一定的蓝图编程基础。初学者可以先用手动调节的 HeightLerp 来模拟。

    三、雾:从“半透明方块”到“体积雾”的进化

    UE5 的默认雾效(Exponential Height Fog)是全局的,无法模拟局部流动的雾气。Niagara 可以创建 体积雾粒子,配合 Mesh Renderer 实现流动感。

    3.1 创建雾 Niagara 系统

    1. 新建 Niagara 系统,选择 GPU 模拟(雾粒子数量多,GPU 更高效)。
    2. Spawn Rate:10000-20000(雾需要大量小粒子填充空间)。
    3. Particle State
    Lifetime:8-15 秒(雾流动慢,生命周期长)
    Initial Velocity:X 轴 `10-30` cm/s(水平流动,模拟风),Y 轴 `-10 ~ 10`,Z 轴 `0`(雾不上升)

    3.2 粒子大小与透明度

    雾的视觉核心是“半透明重叠”:
    1. Sprite Size:100-300 cm(雾粒子要大,才能覆盖空间)。
    2. 在材质中,Opacity 设为 `0.05-0.15`(极低透明度,因为粒子重叠后会变浓)。
    3. 使用 Depth Fade 节点:防止雾粒子与前景物体重叠时出现“硬边”。

    3.3 流动动画:Vortex 模块

    为了让雾产生旋转流动,添加 Vortex 模块:
    1. Vortex Strength:`0.2-0.5`(强度低,模拟自然风造成的涡流)。
    2. Vortex Radius:`500-1000` cm(半径大,雾团缓慢旋转)。
    3. Axis:Z 轴(垂直方向涡流,让雾有上升感)。

    3.4 性能优化:LOD 与 Culling

    雾粒子数量多,必须优化:
    1. 添加 Distance Culling 模块:粒子距离摄像机超过 2000 cm 时,透明度降为 0(不是直接删除,避免闪烁)。
    2. LOD:在 Niagara 的 LOD 设置中,距离远时减少 Spawn Rate 到 5000,并增大粒子 Size 到 500 cm(用大粒子填充远处)。
    3. 使用 Simple Sprite 渲染器(不启用光照计算,减少 GPU 开销)。

    配图3:雾粒子系统的 Distance Culling 设置
    Niagara Distance Culling for Fog

    四、动态切换:从雨到雪的蓝图控制

    天气系统不是静态的,我们需要在蓝图中控制 Niagara 的参数,实现雨→雪→雾的渐变切换。

    4.1 蓝图控制参数

    在 Niagara 系统中,将关键参数暴露为 User Parameter

  • Spawn Rate(控制粒子密度)
  • Initial Velocity Z(控制下落速度,雨-800,雪-100)
  • Particle Size(雨 0.2 cm,雪 50 cm)
  • Noise Amplitude(雪需要噪声,雨不需要)
  • 4.2 渐变逻辑

    在关卡蓝图中,使用 Timeline 节点:
    1. 拖入 Timeline,添加两个 Float 曲线:`RainToSnow` 和 `FogIntensity`。
    2. 曲线从 0 到 1 过渡,持续 5-10 秒。
    3. 在 Update 事件中,将曲线值映射到 Niagara 参数:
    – `SpawnRate = Lerp(5000, 2000, RainToSnow)`(雨减少,雪增加)
    – `VelocityZ = Lerp(-800, -100, RainToSnow)`(速度变慢)
    – `NoiseAmplitude = Lerp(0, 80, RainToSnow)`(雨无噪声,雪有噪声)

    4.3 注意事项

  • 切换时,两个 Niagara 系统可以同时运行,一个负责雨,一个负责雪,通过控制 Spawn Rate 实现渐变,比修改单个系统的参数更稳定。
  • 雾系统建议单独运行,因为它的粒子生命周期长,切换时不会瞬间消失。
  • 五、总结与进阶建议

    这套方案的核心逻辑是:用 Niagara 的 CPU/GPU 模拟 + 材质技巧 替代传统的全局天气系统。雨用 Ribbon 做丝线,雪用 Noise 做飘落,雾用大量低透明度粒子做体积感。每个案例的参数都经过实际测试,直接复制到你的项目里就能看到效果。

    但如果你想让天气系统更“动态”,比如根据时间自动切换(白天雨、傍晚雾、夜晚雪),或者根据地形高度变化(山顶雪、山谷雾),就需要结合 UE5 的 Environment Query System (EQS)Landscape 材质参数集。这属于进阶内容,我们会在后续的课程中专门讲解。

    学习建议
    1. 先复制本文的雨案例,在空白场景里跑通,理解 Ribbon Renderer 和碰撞事件。
    2. 然后尝试雪案例,重点调试 Noise 模块的 Frequency 和 Amplitude,你会发现不同参数组合产生的“雪感”完全不同。
    3. 最后把三个系统整合到一个蓝图中,用 Timeline 控制切换。遇到性能问题,优先用 Distance Culling 和 LOD 解决。

    天气系统是开放世界沉浸感的关键,但不要一次性追求完美。从雨开始,逐步叠加,你会发现自己对 Niagara 的理解会远超预期。

    常见问题 FAQ

    Q1:雨滴的 Ribbon 渲染器为什么会出现“断裂”现象?
    A:检查 Ribbon Renderer 的 Max Ribbon Length 参数,默认是 1000 cm,如果雨滴下落距离超过这个值,丝带会被截断。建议设为 2000-3000 cm。另外,粒子生命周期太短也会导致断裂,确保 Lifetime 大于下落时间。

    Q2:雪的 Noise 模块让粒子飘得太随机,像无头苍蝇,怎么调?
    A:降低 Frequency 到 0.3-0.5,同时增加 Amplitude 的 X/Y 值到 100-150。频率越低,飘落路径越平滑。如果还需要更自然的“旋转下落”,可以叠加一个 Curl Noise 模块,强度设为 0.1-0.2。

    Q3:雾粒子太多导致帧率下降,有什么替代方案?
    A:如果场景不大(比如 100m×100m),可以用 Volumetric Fog 材质配合 Post Process Volume,不需要 Niagara。但如果是开放世界,建议使用 GPU 模拟 并开启 Distance Culling,同时将雾粒子材质中的 Opacity 降低到 0.03-0.05,用更多粒子但更低透明度来模拟密度,视觉效果更好且性能可控。

    Q4:雨滴碰撞后生成的水花粒子不显示,可能是什么原因?
    A:常见错误是子发射器的 Spawn Rate 设为 0。检查子发射器的 Spawn 模块,将 Rate 设为 5-10(每个碰撞事件生�� 5-10 个水花粒子)。另外,确保子发射器的 Lifetime 极短(0.2-0.3 秒),并且 Initial Velocity 有向上的分量。

    Q5:天气切换时,雨和雪同时出现,怎么避免“雨夹雪”的混乱感?
    A:在蓝图中,用 Set Niagara Variable 节点控制两个系统的 Spawn Rate,同时使用 Timeline 的 互斥曲线:当雨曲线从 1 降到 0 时,雪曲线从 0 升到 1。建议给切换过程加一个 3-5 秒的过渡期,让玩家视觉上感觉“雨逐渐变小,雪逐渐变大”,而不是瞬间切换。

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