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

上周有位学员在群里发来一张截图——他的场景里下着暴雨,但雨水穿过角色模型时像“穿模”一样毫无交互,整个效果像一层贴图在飘。他问:“老师,我照着教程调了粒子数量,为什么还是假?”这其实戳中了动态天气系统最核心的痛点:粒子系统不是堆数量就够的,得让它们“活”在场景里

UE5 的 Niagara 粒子系统早已不是传统 Cascade 的“发射-消亡”逻辑,它支持 GPU 模拟、碰撞查询、场景感知,甚至能结合 Chaos 物理做出雨水溅射、积雪堆积。本文不讲理论,直接拆解雨、雪、雾三个系统的 Niagara 实现方案,附带具体参数和操作步骤,帮你绕过“假天气”的坑。

一、暴雨系统:从“穿模”到“环境交互”

1.1 核心问题:粒子与场景的碰撞

默认 Niagara 粒子是“透明”的——它们不会感知地形、墙壁、角色。要实现雨水打到地面溅起水花、落在角色身上滑落,需要两步:GPU 碰撞 + 子发射器触发

操作步骤(UE5.3)

1. 新建 Niagara 系统:选择 `New Niagara System` → `From Selected Emitter` → 选择 `Fountain` 模板(它自带粒子生命周期和速度控制)。
2. 开启 GPU 碰撞
– 打开粒子发射器,在 `Particle Spawn` 阶段添加 `Set Collision Enabled` 节点,设为 `Query Only`(不阻挡物理,仅检测)。
– 添加 `Collision Query` 模块,设置:
– `Collision Channel`:`Visibility`(检测所有可见物体)
– `Response to Channel`:`Overlap`
– 在 `Particle Update` 阶段添加 `On Collision` 事件,输出碰撞位置和法线。
3. 溅射子发射器
– 在 `On Collision` 事件后添加 `Spawn Particles` 节点,生成一个子发射器(比如 `Splash_Sub`)。
– 子发射器参数:
– `Lifetime`:0.3-0.5秒(太快看不清,太长显得拖沓)
– `Sprite Size`:`Random Range(2, 8)`(模拟不同大小水花)
– `Velocity`:沿碰撞法线向上,`Random Range(50, 200)`(模拟弹跳)

关键参数

  • 主粒子发射率:`2000-5000 particles/sec`(暴雨级别)
  • 粒子速度:`800-1200 cm/s`(模拟重力加速度,真实雨滴终端速度约8m/s,但游戏里要调快30%才好看)
  • 阻力(Drag):`0.1`(让雨滴呈抛物线,而非直线下落)
  • 雨滴碰撞溅射

    二、积雪系统:动态堆叠与材质交互

    2.1 思路:用粒子“刷”出雪层

    积雪不是粒子贴上去的,而是让粒子携带颜色/高度信息,动态修改场景材质。UE5 的 `Render Target` 配合 Niagara 的 `Grid 2D` 模块可以做到实时雪堆。

    操作步骤(UE5.4)

    1. 创建 Render Target:`Content Browser` → `Render Target`,尺寸设为 `1024×1024`(性能与画质平衡点)。
    2. Niagara 粒子设置
    – 新建发射器,类型选 `GPU Sprite`。
    – 在 `Particle Spawn` 阶段添加 `Grid 2D Location` 模块:
    – `Grid Size`:`(1024, 1024)`
    – `Grid Origin`:`(0, 0, 0)`(世界坐标,需要对齐场景地面)
    – 粒子属性添加 `User.Attribute`:`SnowHeight`(float,范围0-1)。
    3. 写入 Render Target
    – 在 `Particle Update` 阶段添加 `Write Render Target` 模块:
    – `Target`:选择之前创建的 Render Target
    – `UV Coordinates`:使用粒子的 `Grid Cell` 坐标转换
    – `Color`:`(SnowHeight, 0, 0, 1)`(R通道存储雪高度)
    4. 材质读取
    – 在场景地面的材质中,用 `Texture Sample` 节点读取该 Render Target。
    – 用 `Lerp` 节点混合雪材质和地面材质,`Alpha` 为 `R channel`。

    参数调优

  • 粒子增长速度:`0.01 per second`(每秒增加1%高度,实际游戏里调快至0.05才明显)
  • 粒子寿命:`Infinite`(持续累积,直到用户清除)
  • 粒子数量:`5000-10000`(太多会卡,太少雪堆不连续)
  • > 注意:这种方法只适合静态地形。如果角色行走留下脚印,需要额外用 Chaos 物理生成雪粒子并动态更新 Render Target。

    积雪材质动态变化

    三、雾系统:体积雾与粒子雾的混合策略

    3.1 为什么纯体积雾不够?

    UE5 的 `Exponential Height Fog` 可以快速生成全局雾,但它是“均匀”的——无法模拟山谷中雾气流动、光线穿过雾的丁达尔效应。解决方案:体积雾(全局背景)+ 粒子雾(动态细节)

    操作步骤

    1. 体积雾基础
    – 放置 `Exponential Height Fog` 到场景,参数:
    – `Fog Density`:`0.02`(太浓会遮挡远景)
    – `Fog Height Falloff`:`0.2`(让雾气在低处更浓)
    – `Second Fog Density`:`0.005`(第二层薄雾,增加层次感)
    – 开启 `Volumetric Fog`(在 `Project Settings` → `Rendering` → `Volumetric Fog` 勾选)。

    2. 粒子雾细节
    – Niagara 系统:新建 `GPU Sprite`,使用球形纹理(`T_Ring_01`)。
    – 粒子参数:
    – `Lifetime`:`10-20 seconds`
    – `Sprite Size`:`200-800 cm`(大粒子模拟雾团)
    – `Alpha`:`0.1-0.3`(透明度低,避免遮挡视线)
    – `Velocity`:`Random Direction`,速度 `10-50 cm/s`(缓慢飘动)
    – 添加 `Noise` 模块:让粒子位置随时间抖动,模拟气流扰动。

    3. 丁达尔效应(God Rays)
    – 在 `Post Process Volume` 中开启 `Bloom` 和 `Lens Flares`。
    – 添加 `Light Shafts`(需要定向光源):`Light Source` 设为太阳,`Bloom Threshold` 设为 `0.5`。

    性能优化

  • 粒子雾数量:`200-500`(超过800会掉帧)
  • 体积雾分辨率:`Volumetric Fog Resolution` 设为 `320×160`(平衡画质与性能)
  • 使用 `Distance Cull`:在 `Niagara Renderer` 中设置 `Max Distance` 为 `5000 cm`(远处粒子不渲染)
  • 粒子雾与体积雾混合

    总结与进阶建议

    三个系统的核心逻辑:

  • :GPU 碰撞 + 子发射器实现环境响应
  • :Render Target 动态写入材质
  • :体积雾做底,粒子雾做细节
  • 进阶方向
    1. 天气系统切换:用 `Blueprint` 控制 Niagara 系统的 `User Variables`(如雨量、风速),配合 `Timeline` 实现渐变过渡。
    2. 声音同步:在 `Niagara` 的 `Event` 中触发 `Audio Component`,比如雨水打在金属上的声音与溅射粒子同步。
    3. 性能剖析:用 `Niagara Profiler` 查看每个模块的耗时,重点优化 `Collision Query` 和 `Write Render Target` 的调用频率。

    最后,回到开头那位学员的问题——他缺的不是粒子数量,而是环境交互逻辑。UE5 的 Niagara 给了你所有工具,关键在于把粒子“装进”场景的物理规则里。

    常见问题 FAQ

    Q1:为什么我的雨水粒子没有碰撞效果?
    A:检查两点:1)粒子发射器是否开启 `GPU Simulation`(CPU模式不支持碰撞);2)场景物体是否设置了 `Collision Enabled`(静态网格体默认开启,但植被、角色可能需要手动设置 `Visibility` 通道)。

    Q2:积雪 Render Target 写入后,材质没有变化?
    A:常见错误是 UV 映射不对。确认 `Grid 2D Location` 的 `Grid Origin` 与世界坐标对齐,且 Render Target 的 `Size` 与 `Grid Size` 一致。另外,材质中要使用 `World Position` 节点转换到 UV 空间。

    Q3:粒子雾导致帧率下降严重怎么办?
    A:降低粒子数量至 200-300,并启用 `Distance Cull`。如果体积雾也卡,把 `Volumetric Fog Resolution` 降到 `160×80`,或者改用 `Distance Field` 模拟雾气。

    Q4:如何让雨滴在角色身上滑落?
    A:需要先让角色骨骼网格体参与碰撞。在角色蓝图里,添加 `Niagara Component` 并设置 `Collision Channel` 为 `Pawn`。然后在 Niagara 系统中,用 `On Collision` 事件生成沿法线方向速度的子粒子。

    Q5:动态天气系统可以用于移动端吗?
    A:可以,但需精简。移动端建议:雨用 `Particle Sprite`(无碰撞),雪用 `Material Parameter Collection` 控制纹理混合(不用 Render Target),雾只保留 `Exponential Height Fog`。

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