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` 厘米
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,材质设为半透明白色渐变。关键参数:
在 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 设置,添加三个级别:
同时启用 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 Response 为 Block,并启用 Use Depth Buffer 让粒子自动��物体遮挡。或者将雾粒子放在 Translucent After DOF 渲染通道。
Q4:移动端性能太差怎么办?
A:将粒子数量降到 2000 以下,关闭碰撞检测,改用 Simple Sprite 渲染模式。在项目设置中启用 Mobile HDR 并降低粒子分辨率。
Q5:如何让雨滴和场景物体产生交互?
A:除了碰撞溅射,还可以用 Niagara Data Interface 读取场景中的 Physical Material,让雨滴在不同材质表面(金属、草地、水面)产生不同的溅射效果。

评论(0)