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

上周有位学员在群里发了一个项目截图:场景里用静态粒子模拟下雨,结果从侧面看全是扁平的贴片,毫无立体感。他问我:“老师,UE5 的动态天气到底怎么做才能既高效又真实?” 这个问题其实代表了大多数初学者的痛点——用传统 Cascade 粒子做天气,不仅性能差,而且效果生硬。今天我们就用 UE5 的 Niagara 系统,从零搭建一套包含雨、雪、雾的动态天气方案,让你掌握从粒子参数到场景交互的全流程。

一、基础框架:用 Niagara 构建雨滴粒子系统

1.1 创建发射器与参数配置

打开 UE5.4 版本(建议使用 5.3 以上),在内容浏览器右键选择 FX → Niagara Emitter,命名为 `NS_Rain_Drops`。双击打开后,我们需要先理解 Niagara 的核心逻辑:Emitter State 控制生命周期,Spawn Rate 控制生成速率,Particle State 控制单粒子行为。

Emitter Properties 面板中,将 Spawn Rate 设为 `10000`(每秒生成一万个粒子)。注意:这个数值取决于你的目标平台,PC 端可以开到 20000,移动端建议缩减到 3000。接着在 Particle Spawn 阶段添加 Add Velocity 模块,设置速度向量为 `(0, 0, -800)`,模拟重力下落。

1.2 粒子材质与渲染设置

创建一个材质函数 `MF_RainDrop`,使用 Particle Color 节点控制透明度,核心思路是让粒子从顶部到底部逐渐变淡。材质 Blend Mode 设为 Translucent,Shading Model 为 Unlit。在 Niagara 编辑器中,将材质拖入 Render → Material 插槽。

关键参数调整:

  • Size:在 Particle Spawn 阶段用 Add Particle Size 模块,设置 Uniform 大小为 `2.0` 厘米
  • Lifetime:设为 `1.5` 秒,确保雨滴在下落过程中自然消失
  • Color:通过 Add Particle Color 模块,设置 RGB 为 `(0.8, 0.9, 1.0)`,Alpha 值为 `0.6`
  • 雨滴粒子参数配置界面

    1.3 添加随机性与分布优化

    纯垂直下落的雨会显得机械。在 Particle Spawn 阶段添加 Add Random Range 模块,对 Velocity 的 X 和 Y 轴施加 `±50` 的随机偏移,模拟风吹效果。同时用 Add Random Seed 确保每个粒子的初始位置不重叠。

    实际操作中,我习惯在 Spawn Rate 上加一个 Dynamic Input:用 Noise 节点控制生成频率,这样雨量会呈现自然的间歇性变化。参数设置:Noise 频率 0.2,振幅 0.3。

    二、进阶效果:雪与雾的差异化��现

    2.1 雪花粒子:物理模拟与旋转

    雪花和雨滴的关键区别在于:下落速度慢、有旋转、透明度更高。新建一个发射器 `NS_Snow_Flakes`,在 Particle Spawn 阶段设置速度 `(0, 0, -200)`,并添加 Add Torque 模块,让粒子绕 Z 轴旋转,角速度设为 `(0, 0, 30)` 度/秒。

    雪花材质需要处理半透明和模糊效果。创建一个材质,用 Texture Sample 节点加载一张圆形渐变贴图,通过 Opacity Mask 控制透明度。关键技巧:在 Particle Color 中降低 Alpha 至 `0.3`,并启用 Subsurface Color 节点模拟光线穿透。

    性能优化:雪花粒子数量建议控制在 3000-5000 之间,因为旋转计算比雨滴更耗费资源。在 Emitter State 中启用 Use Global Pool,让引擎自动回收粒子。

    2.2 雾气系统:体积雾与粒子雾的结合

    纯粒子雾容易穿帮,我们需要混合 Exponential Height Fog 和 Niagara 粒子。首先在场景中拖入一个 Exponential Height Fog 组件,设置 Fog Density 为 `0.05`,Fog Height Falloff 为 `0.2`。

    然后创建 Niagara 发射器 `NS_Fog_Particles`,使用 Sprite Renderer,材质设为半透明白色渐变。关键参数:

  • Spawn Rate:`500`(雾气不需要密集粒子)
  • Lifetime:`10` 秒
  • Size:随机范围 `50-200` 厘米
  • Velocity:水平方向随机 `(±100, ±100, 0)`,垂直方向无运动
  • Particle Update 阶段添加 Scale Color by Age 模块,让粒子在生命周期内从透明渐变到半透明再消失,模拟雾气扩散效果。

    雾粒子与高度雾叠加效果

    2.3 动态切换:通过蓝图控制天气

    以上三个发射器可以放在同一个 Niagara System 中,通过蓝图参数控制开关。创建蓝图类 `BP_WeatherController`,添加三个 Niagara Component 分别绑定雨、雪、雾系统。

    在蓝图事件图表中,用 Set Niagara Variable 节点控制 Emitter Enabled 参数。例如按键盘 `1` 键切换雨天:

    事件 1 键按下 → 设置雨系统 Enabled = true,雪系统 Enabled = false
    

    同时用 Timeline 节点实现渐变过渡:在 2 秒内将雨系统的 Spawn Rate 从 0 线性增加到 10000,避免突然出现。

    三、性能优化与场景交互

    3.1 LOD 系统与粒子距离剔除

    当玩家远离天气区域时,高密度粒子会浪费性能。在 Niagara 编辑器中,Emitter State 下找到 LOD 设置,添加三个级别:

  • LOD0(近距离):Spawn Rate 10000,粒子尺寸 2cm
  • LOD1(中距离):Spawn Rate 5000,粒子尺寸 4cm
  • LOD2(远距离):Spawn Rate 1000,粒子尺寸 8cm
  • 同时启用 Cull by Distance,设置 Cull Distance 为 5000 单位(约 50 米),超过此距离的粒子自动隐藏。

    3.2 碰撞与交互:雨滴与地面效果

    默认粒子会穿过地面,我们需要添加碰撞响应。在 Particle Update 阶段添加 Collision 模块,选择 Use Physics Asset,碰撞对象设为 World Static。当粒子碰撞地面时,通过 On Collision 事件触发溅射效果。

    创建一个子发射器 `NS_Rain_Splash`,在母发射器的 Collision Event 中调用 Spawn Sub Emitter,位置设为碰撞点。溅射粒子参数:Spawn Rate 1,Lifetime 0.3 秒,Size 0.5cm,向上速度 100。

    3.3 声音与视觉反馈

    在蓝图中,用 Play Sound at Location 节点配合粒子碰撞事件,播放雨滴声效。注意:不要对每个粒子都播放,而是每 10 个碰撞事件触发一次,否则 CPU 会崩溃。用 Do N 节点控制频率,设置 Count 为 10。

    四、总结与进阶建议

    这套动态天气系统的核心思路是:用 Niagara 的模块化设计分离雨、雪、雾的逻辑,通过蓝图控制实现无缝切换。实际项目中,你还可以进一步扩展:

    1. 风场系统:用 Niagara 的 Force Field 模块让所有粒子受统一风力影响
    2. 天气渐变:用 Curve 参数控制密度、颜色、速度的平滑过渡
    3. 性能监控:在编辑器按 `~` 键输入 `stat Niagara` 查看粒子性能开销

    如果想让效果达到 AAA 级别,建议研究 Niagara Fluid 插件,它支持更真实的流体模拟,但学习曲线较陡。对于大多数项目,本文的方案已经足够在保证性能的前提下获得令人满意的视觉效果。

    常见问题 FAQ

    Q1:为什么我的雨滴看起来像纸片?
    A:检查粒子的 Sprite Alignment 是否设为 Velocity Aligned,确保粒子始终面向摄像机。同时调整材质中的 Opacity 曲线,让雨滴尾部更透明。

    Q2:雪花的旋转效果不明显怎么办?
    A:在 Add Torque 模块中增加角速度值,同时给粒子添加 Random Seed 让每个雪花的初始旋转角度不同。材质中启用 Flipbook 动画也能增强旋转感。

    Q3:雾气粒子穿模到建筑内部了?
    A:在 Collision 模块中设置 Collision ResponseBlock,并启用 Use Depth Buffer 让粒子自动��物体遮挡。或者将雾粒子放在 Translucent After DOF 渲染通道。

    Q4:移动端性能太差怎么办?
    A:将粒子数量降到 2000 以下,关闭碰撞检测,改用 Simple Sprite 渲染模式。在项目设置中启用 Mobile HDR 并降低粒子分辨率。

    Q5:如何让雨滴和场景物体产生交互?
    A:除了碰撞溅射,还可以用 Niagara Data Interface 读取场景中的 Physical Material,让雨滴在不同材质表面(金属、草地、水面)产生不同的溅射效果。

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