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

上周有位学员在课程群提问:“我按教程做了下雨粒子,但雨滴看起来像塑料片,而且穿模严重。更糟的是,场景里一开雾就卡成PPT。” 这其实是很多UE5特效新手的通病——把天气系统当作“粒子堆叠”,忽略了光照、碰撞、性能三者的联动。今天,我就用Niagara 5.3.1版本,从零到一拆解雨、雪、雾的实战方案,重点解决“真实感”与“性能平衡”两个痛点。

一、下雨系统:从“塑料片”到“真实雨幕”的3步改造

1.1 基础粒子设置(避开新手坑)

打开Niagara编辑器,新建发射器类型为“Sprite”。在Emitter Properties中,将Sim Target改为GPU Compute(CPU模式下大量粒子会卡死渲染线程)。关键参数:

  • Spawn Rate:2000-5000(根据场景大小动态调整,室内场景建议≤1500)
  • Lifetime:2.0-3.0秒(配合雨滴下落速度计算:高度20米场景,下落速度约12m/s,寿命=20/12≈1.67秒,留余量到2秒)
  • Sprite Size Mode:选择Uniform,初始大小设为0.8-1.2单位(避免雨滴忽大忽小)
  • 1.2 碰撞与穿模解决方案

    学员提到的“穿模”本质是粒子与几何体碰撞检测不精确。在Particle Update中添加Collision模块:

  • Collision ModeRay Trace(比Distance Field更精确,但消耗略高)
  • Friction:0.0(雨滴不减速)
  • Bounce Restitution:0.0(禁止弹跳)
  • Max Collision Distance:0.5(避免粒子穿透薄墙)
  • 重点:勾选Use Mesh Surface Fallback,当射线检测失败时自动启用网格体表面碰撞。同时,在Render模块的Material中,使用带Opacity Mask的材质(推荐M_RainDrop_01),并开启Translucency Sort Priority为10(确保雨滴在半透明物体前渲染)。

    1.3 动态风场与雨幕倾斜

    真实下雨不会垂直下落。在Emitter State中,添加Wind Data模块(UE5.3原生支持),绑定场景中的BP_WindDirectionalSource。参数:

  • Wind Influence:0.3-0.6(模拟侧风)
  • Turbulence Scale:0.2(增加随机摆动)
  • Particle Spawn中添加Add Velocity节点,将风向向量与下落速度叠加(公式:`(0,0,-1200) + (WindX 200, WindY 200, 0)`)
  • 雨滴粒子碰撞与风向参数设置

    二、降雪系统:分层渲染与半透明穿透优化

    2.1 雪花粒子的特殊处理

    雪与雨不同:体积大、下落慢、需要半透明叠加。新建GPU发射器,关键参数:

  • Spawn Rate:800-1500(雪花数量是雨滴的1/3,避免性能雪崩)
  • Lifetime:5-8秒(配合下落速度1.5-2m/s)
  • Sprite Size:2.0-4.0单位(随机变化,用Random Range节点)
  • Material:使用M_SnowFlake_01,开启Subsurface Color(模拟光线穿透冰晶)
  • 2.2 分层渲染解决“纸片感”

    雪花看起来像“纸片”是因为所有粒子在同一深度层。在Renderer中,设置Sort ModeSort Along Axis,并指定Z轴(相机方向)。同时:

  • Translucency PassAfter Motion Blur(避免运动模糊导致雪花撕裂)
  • Mesh Renderer:可选Ribbon模式,让雪花拖尾(长度0.2-0.5单位,模拟飘落轨迹)
  • 2.3 穿透优化(解决雪花穿入室内)

    Collision模块中,添加Use Async Collision(异步检测,减少主线程卡顿)。同时,在场景中放置BP_WeatherBlocker体积(Cube),将Collision Profile设为OverlapOnlyPawn,粒子检测到体积边界时触发Kill Particle(销毁)。这样室内摄像机就不会看到雪花穿墙。

    雪花分层渲染与碰撞排除设置

    三、雾效系统:体积雾与Niagara的混合方案

    3.1 避免“卡成PPT”的��积雾优化

    UE5的Exponential Height Fog是性能杀手,尤其在移动端。替代方案:用Niagara生成Volume Texture雾粒子。新建CPU发射器(体积雾不能用GPU,否则无法写入纹理),步骤:
    1. 在Emitter Update中,添加Generate Volume Data模块,设置Grid Size为32x32x16(数值越小性能越好,但精度下降)
    2. 粒子类型选VolumeDensityNoise节点(参数:Noise Scale=0.5,Turbulence=0.3,Frequency=2.0)
    3. 在Render中,选择Volume RendererMaterialM_VolumeFog_01,开启Soft Voxel(柔化边缘)

    3.2 动态雾与天气联动

    雾的浓度应随天气变化。在Emitter State中,添加User Exposed参数:

  • Fog Density(float,范围0-1)
  • Fog Color(linear color,默认0.7灰)
  • Particle Spawn中,用Set Vector Attribute节点,将Fog Color与场景BP_SkyLight的颜色混合(公式:`Lerp(FogColor, SkyLightColor, 0.3)`)。这样雾会反射天空颜色,而不是死灰色。

    3.3 性能监控与自适应

    Emitter Properties中,勾选Auto DeactivateCull By Distance(距离相机100米外粒子自动销毁)。同时,在Particle Update中添加LOD模块:当Screen Size小于0.1时,将Density减半(通过Scale Float节点实现)。

    体积雾的Noise参数与性能LOD设置

    四、实战:一键切换天气(蓝图集成)

    4.1 创建天气控制蓝图

    新建BP_WeatherSystem,添加Niagara Component,引用上述三个系统。暴露参数:

  • Weather Type (Enum: None, Rain, Snow, Fog)
  • Transition Time (float, 默认3秒)
  • Event Tick中,用Set Niagara Variable节点动态调整:

  • 下雨时:Rain Density从0渐变到1,Snow Density归零
  • 下雪时:相反
  • 雾天:Fog Density设为0.6,同时降低Rain Density至0.2
  • 4.2 性能优化技巧

  • Pooling:在Niagara System中启用Pooling(默认关闭),复用粒子实例,减少GC压力
  • LOD Bias:在Project Settings > Rendering中,将Niagara LOD Bias设为1(牺牲远端细节,提升近景帧率)
  • Profiling:用Niagara Debugger(快捷键`Shift+Ctrl+,`)查看每个发射器的Particle CountGPU Time,确保雨滴不超过8000个,雪花不超过3000个
  • 总结与进阶建议

    通过以上方案,你已经能实现一个可交互、高性能的动态天气系统。但真实感远不止于此——下一步可以尝试:
    1. 地面湿润效果:用DecalRuntime Virtual Texture实时更新地面材质(雨天地面反射率提升50%)
    2. 天气音效:在BP_WeatherSystem中集成MetaSounds,根据雨滴密度动态调整音频参数
    3. 粒子与物理交互:雪花落在角色身上时,触发Chaos Physics的布料模拟

    记住,天气系统的核心不是堆粒子,而是“欺骗”人眼:低分辨率下用颜色和动态模糊代替细节,高分辨率下用碰撞和光影增加沉浸感。遇到性能瓶颈时,优先优化粒子数量碰撞检测范围,而非盲目升级材质。

    常见问题 FAQ

    Q1:为什么我的雨滴在远距离时变成立方体?
    A:这是Sprite Size未设置Min Screen Size导致。在RendererSprite模块中,勾选Use Screen Size,设置Min Size为2像素,Max Size为20像素。同时,在材质中启用Mip Bias,让远距离纹理自动模糊。

    Q2:雪花粒子与角色碰撞后,角色身上出现黑色方块?
    A:这是碰撞检测的Normal Bias过小。在Collision模块中,将Normal Bias从0.1改为0.3,并勾选Use Simple Collision。如果仍出现,在角色骨骼网格体的Collision Presets中,将Visibility Channel设为Block

    Q3:体积雾导致场景过暗,如何调整?
    A:在Volume RendererMaterial中,添加Emissive Color节点,并连接Fog Density的倒数(`1 – Density`)。同时,在Post Process Volume中,将Ambient Cubemap的强度降低至0.3,避免雾和光照叠加过曝。

    Q4:移动端运行雨雪系统直接闪退?
    A:移动端不支持GPU粒子,需将Sim Target改为CPU Compute,并开启Use Fixed Time Step(防帧率波动)。同时,在Project Settings > Platforms > Android中,将Maximum Particle Count设为2000,并关闭Depth FadeMotion Blur

    Q5:天气切换时,粒子突然消失或闪烁?
    A:在Emitter State中,设置Transition Time为1-2秒,并在Particle Spawn中添加Lerp节点,将Density从旧值渐变到新值。同时,启用Use Pooling,防止粒子实例销毁时产生GC卡顿。

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