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

火星人教育 UE5 实战课堂

“老师,我照着教程做了个下雨特效,但粒子像瀑布一样砸下来,完全没有真实感……而且一到场景里就卡成PPT,是不是我的电脑配置不够?”——这是上周一位学员在深夜发来的求助消息。

其实,这根本不是硬件问题,而是对 Niagara 粒子系统的核心机制理解不到位。真实感天气效果,关键在于粒子数量控制碰撞反馈视觉层次的平衡。今天,我们就用 UE5.3/5.4 版本,从零搭建一套可动态切换的雨、雪、雾系统,彻底解决“假、卡、僵”的问题。

一、核心架构:Niagara 天气系统的模块化设计

1.1 为什么不用蓝图或 Cascade?

在 UE5.4 中,Cascade 已被标记为“遗留系统”,而 Niagara 凭借GPU 模拟模块化堆栈事件驱动能力,成为天气特效的首选。核心优势有三:

  • GPU Spawn:利用显卡并行计算,支持百万级粒子(雨滴)而 CPU 负载几乎为零。
  • Parameter Mapping:通过全局参数(如风速、强度)实时控制所有粒子行为,无需逐个修改。
  • Collision with Geometry:粒子可与场景网格体(地面、树叶、建筑)发生真实碰撞,产生飞溅、滑动等反馈。
  • 1.2 系统架构设计

    我们创建三个独立的 Niagara 系统(`NS_Rain`、`NS_Snow`、`NS_Fog`),通过同一个 `BP_WeatherController` 蓝图控制切换和参数。每个系统的核心模块如下:

    ├── Emitter State
    │   ├── Life Cycle: Loop Behavior (Infinite)
    │   └── Simulation Target: GPU Compute Sim (雨/雪) / CPU Sim (雾)
    ├── Particle Spawn
    │   ├── Spawn Rate: 动态强度值
    │   └── Initialize Particle: 位置、速度、大小
    ├── Particle Update
    │   ├── Force: 重力 + 风力(自定义向量)
    │   ├── Collision: 场景碰撞 + 飞溅事件
    │   └── Color/Lifetime: 透明度渐变
    └── Render
        └── Material: 半透明材质(雨滴/雪花/雾片)
    

    > 版本提示:以下操作基于 UE5.3.2 和 UE5.4.2,两者 Niagara 编辑器界面一致,但 5.4 新增了“GPU Collision Culling”选项,可进一步提升性能。

    二、实操案例一:动态降雨系统(含碰撞飞溅)

    2.1 创建基础降雨粒子

    1. 新建 Niagara 系统:内容浏览器右键 → FX → Niagara System → 选择“New system from selected emitter” → 选择“Fountain”模板(便于后续修改)。
    2. 设置 GPU 模拟
    – 在 Emitter 属性面板 → `Simulation Target` → 改为 `GPU Compute Sim`。
    – 关闭 `Local Space`(粒子在世界空间运动)。
    3. 调整 Spawn Rate
    – 找到 `Spawn Rate` 模块,默认值为 100。改为 `User Exposed` 参数,命名为 `RainIntensity`,类型 `Float`,范围 0-1000。
    – 勾选 `Spawn Rate` 的 `Infinite Loop`,让粒子持续生成。
    4. 粒子初始状态
    – `Initialize Particle` 模块:取消 `Lifetime` 默认值,改为 `User Exposed` 参数 `RainLifetime`(建议 1.5-2.0 秒)。
    – 在 `Add Velocity` 模块:添加一个 `Vector from Float` 节点,X/Y 为 0,Z 设为 `-800~-1200`(模拟重力加速度)。
    5. 风力影响
    – 在 `Particle Update` 堆栈 → 添加 `Force` 模块 → 将 `Force` 向量设为 `(WindX, WindY, 0)`,其中 `WindX` 和 `WindY` 暴露为全局参数(可在蓝图中动态修改)。

    2.2 碰撞与飞溅效果

    真实感的核心在于雨滴接触地面后的反馈。UE5.4 的 Niagara 提供了 `Collision` 模块,可触发飞溅粒子。

    1. 启用碰撞
    – 在 `Particle Update` 堆栈 → 添加 `Collision` 模块。
    – 设置 `Collision Mode` = `Scene Geometry`(场景几何体)。
    – `Friction` = 0.0(雨滴不减速),`Restitution` = 0.1(轻微反弹)。
    2. 触发飞溅事件
    – 在 `Collision` 模块下方 → 点击 `+` 号 → 添加 `Generate Collision Events`。
    – 这会创建一个 `Collision Event`,可用于生成次级粒子(飞溅水花)。
    3. 创建飞溅子发射器
    – 在 Niagara 系统 → `Emitter` 面板 → 右键 → `Add Emitter` → 选择 `Empty Emitter`。
    – 将此发射器的 `Simulation Target` 设为 `CPU Sim`(飞溅粒子数量少,无需 GPU)。
    – 在 `Spawn` 模块 → `Spawn Rate` 改为 `0`(不自动生成),然后添加 `Event Handler` 模块:
    – `Source ID` = 父粒子的 `Collision Event` ID(默认 0)。
    – `Spawn Count` = 3~5(每次碰撞生成 3-5 个飞溅粒子)。
    – 飞溅粒子的 `Initialize Particle`:位置设为 `Collision Location`,速度设为 `(Random(-100,100), Random(-100,100), 200)`(向上飞溅),Lifetime 设为 0.3~0.5 秒。

    2.3 优化性能:LOD 与 Culling

    在 `Emitter State` 模块中:

  • 启用 `GPU Compute Culling`(UE5.4 特有):勾选后,相机不可见的粒子会被自动剔除,性能提升 30% 以上。
  • 设置 `Max Particles` = `RainIntensity * 2`(动态适配强度)。
  • 实操小练习:雨滴材质与视觉效果

    1. 创建一个 `Material`,类型为 `Surface`,Blend Mode 设为 `Translucent`。
    2. 使用 `Particle Color` 节点控制颜色(浅蓝灰,Alpha 0.3-0.6)。
    3. 添加 `Texture Coordinate` 节点,连接一个 `Rotator` 节点,让雨滴纹理沿 Z 轴旋转(模拟下落时的拉长感)。
    4. 在 Niagara 系统的 `Renderer` 模块中,将 `Material` 指定为该材质,`Sort Mode` 设为 `Sort by Depth`(避免透明排序错误)。
    5. 运行场景,调整 `RainIntensity` 从 0 到 500,观察性能变化。

    三、实操案例二:动态降雪与雾效系统

    3.1 雪花粒子:随机旋转与飘落轨迹

    雪与雨的核心区别在于:下落速度慢受空气阻力影响粒子旋转

    1. 新建雪花系统:复制 `NS_Rain` 并重命名为 `NS_Snow`。
    2. 调整物理参数
    – 粒子速度 Z 轴改为 `-100~-200`(缓慢下落)。
    – 在 `Particle Update` 添加 `Drag` 模块,`Drag` 值设为 `0.1~0.3`(模拟空气阻力)。
    – 添加 `Random Torque` 模块(UE5.4 新增):让粒子绕 Z 轴随机旋转,产生飘忽感。
    3. 雪花材质
    – 使用六边形或圆形纹理,边缘柔化。
    – 在材质的 `Opacity Mask` 中,用 `Noise` 节点生成随机形状(避免所有雪花一样)。
    4. 风力影响
    – 在 `Force` 模块中,将 `WindX` 和 `WindY` 乘以 `0.5`(雪比雨更易受风影响)。
    – 添加 `Turbulence` 模块(位于 `Force` 下方):强度 0.2,频率 0.5,让雪花呈波浪状飘落。

    3.2 体积雾:基于 Depth Fade 的层次控制

    雾效不适合用大量粒子模拟,而是利用半透明平面深度渐变

    1. 创建雾效系统:新建 `NS_Fog` → 选择 `Empty Emitter` → `Simulation Target` = `CPU Sim`。
    2. 粒子生成策略
    – `Spawn Rate` = 1(每秒生成 1 个粒子,但每个粒子 Lifetime 很长)。
    – `Initialize Particle`:Lifetime 设为 `10~20` 秒,位置在相机前方 500~2000 单位随机分布。
    3. 雾片材质
    – 创建一个 `Material`,Blend Mode = `Translucent`,Shading Model = `Unlit`。
    – 核心节点:`Depth Fade` 节点(输入 `Opacity`),让雾片在靠近物体时变透明(避免遮挡)。
    – `Particle Color` 节点控制颜色(浅灰蓝,Alpha 0.1-0.3)。
    4. 动态密度控制
    – 在 Niagara 系统中添加 `User Exposed` 参数 `FogDensity`(范围 0-1)。
    – 在 `Particle Update` 中,用 `Lerp` 节点将 `FogDensity` 映射到粒子大小(密度高时粒子变大,���盖更广)。

    实操小练习:天气切换蓝图

    1. 创建 `Blueprint Class` → 选择 `Actor`,命名为 `BP_WeatherController`。
    2. 添加三个 `NiagaraComponent` 变量,分别指向 `NS_Rain`、`NS_Snow`、`NS_Fog`。
    3. 在 Event Graph 中:
    – 用 `Set Niagara Variable (Float)` 节点设置 `RainIntensity`、`WindX` 等参数。
    – 用 `Activate/Deactivate` 节点切换天气系统。
    4. 添加一个 `Timeline` 节点,让天气在 5 秒内渐变切换(例如雨转雪时,`RainIntensity` 从 500 渐变为 0,`SnowIntensity` 从 0 渐变为 300)。

    天气系统架构图

    Niagara粒子碰撞设置

    四、总结与进阶建议

    通过以上两个案例,你已经掌握了:

  • 用 GPU 模拟实现百万级粒子降雨
  • 用碰撞事件触发飞溅效果
  • 用空气阻力和旋转模拟雪花飘落
  • 用 Depth Fade 材质实现体积雾
  • 下一步学习建议:
    1. 性能调优:学习 Niagara 的 `Profiler` 工具,分析 GPU/CPU 负载,优化 `Max Particles` 和 `LOD` 设置。
    2. 动态天气系统:结合 `Sky Atmosphere` 和 `Volumetric Cloud`,让天气影响环境光照(例如阴天时天空变暗)。
    3. 交互反馈:在雨滴碰撞时,通过 `Niagara Event` 触发材质参数变化(如地面变湿、水坑形成)。

    常见问题 FAQ

    Q1:为什么我的雨滴粒子在 GPU 模拟下还��卡顿?
    A:检查 `Max Particles` 是否过高(建议不超过 5000),并确认 `GPU Compute Culling` 已启用(UE5.4 特有)。另外,避免在粒子材质中使用 `Custom` 节点或复杂数学运算。

    Q2:雪花粒子为什么不会旋转?
    A:需要添加 `Random Torque` 模块(UE5.4 新增),或手动在 `Particle Update` 中用 `Add Angular Velocity` 节点。确保粒子的 `Mesh Renderer` 或 `Sprite Renderer` 支持旋转。

    Q3:雾效粒子出现“闪烁”或“透明排序错误”怎么办?
    A:在雾片材质的 `Translucency` 设置中,将 `Sort Priority` 设为 `-1`(后渲染),并启用 `Separate Translucency`。同时,在 Niagara 的 `Renderer` 模块中勾选 `Sort by Distance`。

    Q4:如何让雨滴落到树叶上产生不同的声音反馈?
    A:在碰撞事件中,通过 `Physical Material` 判断碰撞表面类型。在 Niagara 中无法直接播放声音,但可以在碰撞事件触发时,调用蓝图中的 `Play Sound at Location` 节点。

    Q5:我的 UE5.3 项目升级到 5.4 后,Niagara 系统崩溃了怎么办?
    A:UE5.4 对 Niagara 的模块进行了部分重构。右键点击 Niagara 系统 → `Asset Actions` → `Migrate`,然后在新版本中重新导入。或者手动检查 `Emitter State` 中的 `Simulation Target` 和 `GPU Compute Culling` 设置。

    火星人教育 UE5 特效课程提示:实战中,天气系统往往需要与 `Landscape`、`Foliage` 和 `Character` 交互。下一期我们将讲解“动态水坑生成”和“雨滴涟漪材质”,用 Niagara Event 驱动场景元素变化。

    *(全文完)*

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