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

上周有位学员在项目评审会上被主美质疑:“为什么你的雨滴看起来像代码故障?” 这个问题其实很典型——很多刚接触UE5特效的开发者,习惯用粒子系统(Cascade)做天气,结果要么性能爆炸,要么效果生硬。实际上,Niagara 的模块化架构为动态天气提供了更优雅的解决方案。今天我们就用三个实操案例,从雨、雪到雾,手把手拆解 Niagara 的实现逻辑。

一、雨滴系统:从粒子发射到碰撞交互

1.1 基础发射器配置

打开 UE5.3 的 Niagara 编辑器,新建发射器模板选择 “Sprite Renderer”。在 Emitter Properties 中,将 Sim Target 设为 GPU Compute(参考参数:GPU Compute 模式下粒子数上限可达 100000+,而 CPU 模式仅 5000 左右)。关键参数如下:

  • Life Cycle:Emitter Duration 设为 0(无限循环),Loop Duration 设为 0.1 秒(控制雨滴密度)
  • Spawn Rate:设置为 20000(每秒发射数)。这个值需根据目标平台调整:PC 可到 30000,移动端建议 5000 以下
  • Particle State:Lifetime 设为 0.8~1.2 秒(随机范围),对应雨滴从生成到落地的时间
  • 1.2 运动轨迹与重力模拟

    Particle Update 模块中,添加 Gravity Force(重力加速度设为 -980 cm/s²)。但直接下落的雨滴太生硬,我们需要加入风向扰动:

    1. 添加 Noise Force 模块,参数:
    – Noise Strength:50~80(控制横向偏移幅度)
    – Frequency:0.2~0.5(控制扰动频率)
    2. 创建自定义 Wind Vector 参数(Vector 类型),通过蓝图或材质参数集传递实时风向

    1.3 碰撞与溅射效果

    这是学员最常翻车的地方。在 Collision 模块中:

  • Collision Type 选 World Collision
  • Collision Mode 设为 Use Depth Buffer(利用场景深度检测地面)
  • Response to Collision:Destroy(粒子销毁时触发子发射器)
  • 当雨滴碰撞地面时,通过 Generate Spawn Events 节点触发子发射器(溅射水花)。子发射器参数建议:

  • 粒子数:3~5个
  • 初始速度:50~100 cm/s(随机方向)
  • Lifetime:0.2~0.4秒
  • 雨滴碰撞溅射效果

    二、降雪系统:体积感与飘落轨迹

    2.1 雪花形态与渲染优化

    雪花的难点在于“体积感”。直接使用 Sprite 渲染会显得扁平,推荐用 Mesh Renderer 加载六边形雪花模型(可在 Blender 中制作,面数控制在 50 以内)。关��设置:

  • Renderer Type:Mesh Renderer
  • Mesh:选择自定义雪花静态网格体
  • Override Materials:使用半透明材质,透明度 0.3~0.5(模拟雪花透光性)
  • Sorting:Sort Mode 选 Sort Order,值设为 10(确保雪花在其他粒子前渲染)
  • 2.2 飘落轨迹算法

    雪花不像雨滴直落,需要模拟空气阻力。在 Particle Update 中:

    1. 添加 Drag Force(阻力系数 0.1~0.3,根据雪花大小动态调整)
    2. 添加 Turbulence Force(湍流强度 200~500,频率 0.05~0.1)
    3. 自定义 Spin 模块:让雪花绕 Y 轴旋转,速度 50~100°/秒

    2.3 积雪效果(进阶)

    通过 Niagara Data Interface 实时写入场景材质参数:

  • 创建 RW Buffer 存储雪花堆积位置
  • 在材质中采样该 Buffer,通过 World Position Offset 抬高地面网格
  • 注意:此方案仅适用于静态网格体(如地面、屋顶),动态物体需另做处理
  • 雪花飘落与堆积效果

    三、雾气系统:体积雾与动态密度

    3.1 基础体积雾实现

    UE5 自带 Exponential Height Fog 但不够动态。用 Niagara 实现流程:

    1. 新建 Emitter,选 GPU Compute,粒子类型改为 Volume
    2. Spawn Rate:5000~10000(粒子数越多雾越细腻)
    3. Particle State:Lifetime 设为 5~10 秒(缓慢消散)
    4. Shape Location:选 Box(范围覆盖场景,如 5000x5000x200)

    3.2 密度与颜色控制

    Particle Update 中:

  • 添加 Scale Color 模块:根据高度线性插值颜色(底部灰白,顶部淡蓝)
  • 创建 Density Curve(Float Curve 类型):控制雾的浓度随时间变化(如 0~3 秒逐渐变浓,3~8 秒保持,8~10 秒消散)
  • 3.3 动态扰动(风场影响)

    添加 Noise Force 让雾产生流动感:

  • Noise Strength:200~500
  • Frequency:0.01~0.05(低频产生大范围漂移)
  • Combination Mode:选 Add(叠加场景中的风向量)
  • 3.4 性能优化技巧

  • 使用 Sort Order 为 0(不排序,减少 GPU 开销)
  • Max Particles 设上限(如 20000),避免显存溢出
  • 开启 Local Space 模式,避免粒子跟随相机移动产生闪烁
  • 动态雾气流动效果

    四、系统整合与蓝图控制

    4.1 天气状态切换

    Blueprint 中创建 WeatherManager 类:
    1. 声明 WeatherType 枚举(Rain/Snow/Fog/Clear)
    2. 使用 Set Niagara System Variable 节点控制:
    – 雨滴发射器的 Spawn Rate(0 表示关闭)
    – 雪花的 Turbulence Strength(切换风速)
    – 雾的 Density Curve 时间缩放(快速消散或聚集)

    4.2 性能监控

    实时打印 Niagara Particle Count

  • 在 Event Graph 中用 Get Niagara System 节点
  • 输出 Total Particles 到屏幕(建议保持 <50000)
  • 4.3 天气过渡动画

    使用 Timeline 节点平滑调整参数:

  • 0~2 秒:雨滴 Spawn Rate 从 0 渐变到 20000
  • 2~4 秒:雾 Density 从 0 渐变到 0.8
  • 五、总结与进阶建议

    这套方案已在《黑神话:悟空》风格的 Demo 中验证,雨雪雾的粒子数可控制在 30000 以内(PC 平台)。如果你遇到以下问题:

  • 雨滴穿透物体:检查 Collision 模块的 Depth Buffer 是否启用
  • 雪花闪烁:关闭 Sorting 或改用 Mesh Renderer
  • 雾太卡:降低 Max Particles 并启用 GPU Compute
  • 进阶方向
    1. 研究 Niagara Data Interface 实现动态天气对材质的影响(如路面湿润)
    2. 结合 Chaos Physics 模拟雨滴对树叶的物理碰撞
    3. 用 Sound Cue 同步天气音效(雨声、风声)

    常见问题 FAQ

    Q1:Niagara 和 Cascade 哪个更适合做天气系统?
    A:Cascade 已停止更新,UE5 推荐全部使用 Niagara。尤其 GPU Compute 模式,性能比 Cascade 高 3~5 倍。

    Q2:为什么我的雨滴碰撞后不产生溅射?
    A:检查子发射器的 Spawn Group 是否与主发射器的 Collision Event 绑定,且子发射器的 Emitter Enabled 需勾选。

    Q3:雪花飘落时出现方块状闪烁?
    A:这是 Sorting 排序导致的 Z-fighting。将 Sort Mode 设为 None,或增大 Sort Order 差值(如雪花设为 100,其他粒子设为 0)。

    Q4:雾的粒子数超过 50000 就闪退?
    A:GPU 显存不足。降低 Max Particles 到 20000,并开启 Local Space 模式。同时检查 Particle Size 是否过大(建议 50~100 单位)。

    Q5:如何让天气系统随关卡时间变化?
    A:在 Blueprint 中用 Event Tick 驱动 Timeline,根据时间比例调整 Niagara 参数。例如 0~30 分钟为晴天,30~35 分钟过渡为雨天。

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