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`(暴雨级别)
—
二、积雪系统:动态堆叠与材质交互
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`。
参数调优:
> 注意:这种方法只适合静态地形。如果角色行走留下脚印,需要额外用 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`。
性能优化:
—
总结与进阶建议
三个系统的核心逻辑:
进阶方向:
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`。

评论(0)