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

上周,一位学员在项目群求助:“我用纯粒子做了暴雨,结果帧率从120掉到45,根本没法用。” 这是很多UE5开发者的共同痛点——天气系统看似简单,但要在性能与视觉之间找到平衡,背后是粒子系统设计、材质优化和场景交互的综合技术。今天,我拆解一套基于 Niagara 的动态天气系统方案,从雨、雪到雾,让你在5.3及以上版本中实现高性能、可交互的天气效果。

一、雨:从“粒子暴雨”到“性能友好型”方案

案例:你的雨为什么卡?

学员的暴雨用了 10 万个粒子,每个粒子带碰撞和透明度衰减。这是典型误区——Niagara 的 CPU 模拟对大量粒子开销巨大。正确思路是:用 GPU 粒子 + 分层粒子系统

步骤1:创建 GPU 雨粒子发射器

  • 打开 Niagara 编辑器,选择“新建发射器” → “GPU 粒子”。
  • 版本:UE5.3,Niagara 模块版本 v2.0。
  • 在“发射器属性”中,将“模拟目标”设为“GPU Compute”,确保使用 GPU 加速。
  • 步骤2:配置粒子生命周期与外观

  • 在“粒子生成”模块中,设置:
  • – `Particles.Lifetime`:0.8~1.5秒(随机浮动,避免整齐下落)。
    – `Spawn Rate`:每帧 200~500 个(根据场景调整,室内可降至100)。

  • 在“粒子更新”模块中:
  • – `Particles.Velocity`:Z 轴设为 -800 ~ -1200 cm/s(模拟重力加速度)。
    – 添加“Drag”模块:线性阻力 0.1,让雨滴下落更自然。

  • 材质方面:使用 M_RainDrop(引擎自带,路径:`/Engine/PlasticMaterials/M_RainDrop`),或自己创建半透明材质,设置 `Opacity` 为 0.4~0.6,`Roughness` 为 0.8。
  • 步骤3:优化性能的关键——视锥剔除和LOD

  • 在“发射器更新”中,添加“Cull by View Frustum”模块:勾选“Cull Particles”,让屏幕外的粒子不生成。
  • 添加“LOD by Distance”:设置近距(0~5000单位)生成全量粒子,远距(5000~10000)减少50%生成量。这能大幅降低远处粒子的开销。
  • 雨粒子参数配置界面

    步骤4:交互——雨滴与地面的碰撞

  • 在“粒子更新”模块中添加“Collision”模块:
  • – 选择“World Collision”,碰撞类型为“Query Only”。
    – 设置“Bounce Restitution”为 0.1(几乎不反弹)。
    – 勾选“Generate Collision Events”,用于触发溅射效果。

  • 创建第二个发射器“RainSplash”:在碰撞事件中生成 5~10 个小粒子(生命周期 0.2秒),模拟水花。
  • 性能对比:纯 CPU 粒子 10 万个 → 帧率 45fps;GPU 粒子 5 万个 + LOD → 帧率 110fps(RTX 3060 测试场景)。

    二、雪:从“飘落”到“堆积”的完整链路

    雪与雨不同:它需要随机飘动、堆积在地面,并随光照变化。核心是风力模拟 + 材质积雪效果

    2.1 飘雪粒子:风力与旋转

    步骤1:创建雪粒子发射器(GPU)

  • 设置 `Particles.Lifetime`:3~6秒(雨滴的3倍,让雪花有足够时间飘落)。
  • `Spawn Rate`:每帧 100~300(雪比雨稀疏,但粒子更大)。
  • 速度:Z 轴 -50~-150 cm/s(缓慢下落),XY 轴添加随机扰动(-30~30 cm/s)。
  • 步骤2:风力模拟

  • 在“粒子更新”中,添加“Force”模块,设置风力向量:`(100, 50, 0)`(风向可随时间变化)。
  • 更自然的方案:使用“Vortex”模块(Niagara 5.3 新增),设置涡旋强度 0.5,让雪花形成旋转飘落效果。
  • 添加“Rotation”模块:让雪花粒子绕 Z 轴旋转(角速度 30~60度/秒),模拟真实雪花翻转。
  • 步骤3:雪花外观材质

  • 创建材质 `M_SnowFlake`,使用 `Opacity Mask` 模式,贴图用六边形雪花纹理(可在线生成)。
  • 关键参数:`BaseColor` 设为纯白色,`Emissive Color` 微弱(0.1~0.3),让雪花在暗处可见但不刺眼。
  • 2.2 地面积雪:材质与蓝图交互

    单纯粒子无法实现“堆积”,需要结合材质和蓝图。

    步骤1:创建积雪材质函数

  • 在材质中,使用 `World Position` 节点,结合 `Distance to Nearest Surface` 函数(需启用“距离场”)。
  • 计算雪覆盖厚度:`SnowDepth = max(0, 1 – Distance / MaxSnowHeight)`,其中 `MaxSnowHeight` 设为 20cm。
  • 混合地面颜色:`Lerp(GroundColor, SnowColor, SnowDepth)`,让雪从薄到厚渐变。
  • 步骤2:蓝图动态控制

  • 在场景中放置 `BP_SnowManager` 蓝图,Tick 事件中更新材质参数集合(Material Parameter Collection,MPC)。
  • 参数:`SnowIntensity`(0~1),控制积雪覆盖范围。当 `SnowIntensity > 0.5` 时,激活“雪地脚印”系统(使用 Decal 投射脚印纹理)。
  • 雪粒子与地面积雪效果

    性能提示:积雪材质对距离场计算开销较大,建议只在近处(玩家周围 20 米内)启用,远处用静态贴图代替。

    三、雾:体积雾与 Niagara 粒子雾的结合

    UE5 的体积雾(Volumetric Fog)很强,但性能开销大。我推荐混合方案:远距离用体积雾,近距离用 Niagara 粒子模拟流动雾

    3.1 体积雾配置(远距离)

  • 打开“后期处理体积”(Post Process Volume),勾选“Volumetric Fog”。
  • 参数建议:
  • – `Fog Density`:0.02~0.05(浓雾可设为0.1)。
    – `Fog Height Falloff`:0.5(雾从地面向上衰减)。
    – `Volumetric Scattering Intensity`:0.3~0.5(控制光散射效果)。

  • 配合“指数高度雾”(Exponential Height Fog):设置 `Fog Density` 为 0.01,`Start Distance` 为 1000 单位,让远处雾更浓。
  • 3.2 近距流动雾粒子(Niagara)

    步骤1:创建 CPU 粒子雾发射器

  • 使用 CPU 粒子,因为需要频繁更新位置和透明度。
  • 设置 `Spawn Rate`:每帧 10~20 个(数量少,但粒子大)。
  • 粒子大小:半径 200~500 单位,使用半透明材质。
  • 步骤2:粒子行为

  • 在“粒子更新”中,添加“Noise”模块:让粒子位置随时间随机漂移(幅度 50~100 单位/秒)。
  • 透明度控制:使用 `Particles.Alpha`,初始为 0.3,在生命周期内波动(0.1~0.5),模拟雾的密度变化。
  • 添加“Scale Color”模块:基于粒子年龄,让雾从生成到消散逐渐变淡。
  • 步骤3:雾材质

  • 创建材质 `M_FogParticle`,使用 `Translucent` 混合模式。
  • 贴图:用噪声纹理(如引擎自带的 `T_Noise`),让雾边缘模糊。
  • 关键:禁用“Depth Test”,避免雾粒子与场景物体产生遮挡问题。
  • 流动雾粒子效果

    性能对比:纯体积雾在复杂场景(如森林)中帧率下降 20%;混合方案(体积雾+粒子雾)仅下降 8%,且近处雾更自然。

    四、总结与进阶建议

    这套动态天气系统方案,核心是分层设计

  • 雨:GPU 粒子 + LOD + 碰撞事件,用 5 万个粒子达到 10 万个的效果。
  • 雪:风力模拟 + 材质积雪,结合蓝图动态控制。
  • 雾:远距离体积雾 + 近距离粒子雾,平衡性能与视觉。
  • 进阶建议
    1. 天气过渡:使用 Timeline 组件(蓝图)在 3~5 秒内切换雨/雪/雾参数,避免突变。
    2. 音效集成:在 Niagara 发射器中添加“Audio”模块,根据粒子数量动态调整雨声音量。
    3. RTX 优化:如果启用光追,将雨、雪粒子的“Shadow”设为“None”,避免光追阴影计算。
    4. 移动端适配:将粒子数量减半,关闭距离场积雪,用静态贴图替代。

    常见问题 FAQ

    Q1:GPU 粒���发射器在 UE5.2 中不工作,怎么办?
    A:UE5.2 的 GPU 粒子稳定性较差,建议升级到 5.3 或 5.4。如果必须用 5.2,在“项目设置”→“Niagara”中勾选“Force CPU Particle Emulation”,但性能会下降约 30%。

    Q2:雨滴碰撞后溅射效果不显示?
    A:检查“Collision”模块的“Generate Collision Events”是否勾选,并确保第二个发射器(溅射)的“Spawn Per Particle”模块正确绑定到碰撞事件。常见错误是事件绑定到“Particle Death”而非“Collision”。

    Q3:积雪材质在远处闪烁?
    A:这是因为距离场计算精度不足。在“世界设置”中提高“Distance Field Resolution”至 256,或为积雪材质添加“Temporal Anti-Aliasing”节点(使用 `SceneTexture:SceneColor` 进行混合)。

    Q4:粒子雾与体积雾重叠导致画面过亮?
    A:在粒子雾材质的“Emissive Color”中,乘以 0.2~0.3,降低自发光强度。同时,在体积雾设置中,将“Scattering Intensity”降低至 0.2,避免叠加。

    Q5:如何让天气系统在不同场景(白天/夜晚)自动调整?
    A:使用“天气控制蓝图”,读取场景中的“方向光”角度。当光照强度低于 0.5 时,自动增加雾密度(从 0.02 升至 0.08),并降低雨/雪粒子的透明度,模拟夜间能见度下降。

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