UE5 动态天气系统:雨、雪、雾的 Niagara 实现方案
上周在火星人教育的 UE5 特效进阶班上,一位学员小王向我抱怨:“老师,我按照教程做了个下雨特效,结果帧率直接掉到 30,而且雨滴看起来像在飘,完全没有真实感。”这个问题并不少见——许多特效师在制作动态天气时,要么性能失控,要么视觉效果假得离谱。今天,我就用两个完整的 Niagara 案例,带你从零搭建一套高性能、高真实感的动态天气系统,涵盖雨、雪、雾的完整实现方案。
一、核心思路:为什么用 Niagara 而不是传统粒子系统?
在 UE5.3 中,Niagara 已经是特效系统的标配。相比旧版 Cascade,Niagara 的优势在于:
- GPU 模拟:支持大规模粒子计算(10万+粒子)而不拖垮 CPU
我们这套系统的设计目标是:
—
二、实操案例 1:��性能雨天系统(Niagara GPU 粒子)
步骤 1:创建基础 Emitter
打开 UE5.3,在 Content Browser 右键 → VFX → Niagara Emitter,选择 Empty Emitter。重命名为 `NS_Rain_GPU`。
在 Emitter Properties 中:
步骤 2:配置粒子生成
添加 Spawn Rate 模块,设置:
在 Initialize Particle 模块中,调整:
步骤 3:模拟重力与风
添加 Gravity 模块,设置:
添加 Drag 模块(空气阻力):
关键技巧:为了让雨滴看起来不是垂直下落,添加 Wind 模块(需自己创建或使用内置的 Curl Noise Force):
步骤 4:渲染优化
在 Renderer 中:
步骤 5:性能调试
在 Niagara 编辑器中,点击 Preview 面板的 Performance 标签,观察:
如果帧率过高,可以:
—
三、实操案例 2:雪与雾的混合系统
雪粒子系统(NS_Snow_GPU)
雪与雨的区别在于飘落速度和旋转。创建新 Emitter `NS_Snow_GPU`,重复雨天步骤,但修改以下参数:
在 Initialize Particle 中:
在 Gravity 中:
添加 Rotate 模块(模拟雪片旋转):
关键:使用 Curl Noise Force 模拟雪花飘忽不定的轨迹:
雾气系统(NS_Fog_Volume)
雾气不需要粒子,而是使用 Volume Texture 或 Screen Space 效果。这里我推荐轻量级方案:
创建 Niagara System → 选择 Empty,然后添加 Grid 2D 发射器(用于屏幕空间雾)。
在 Initialize Particle 中:
材质方面,使用 `M_Fog_Depth`(基于深度纹理的雾材质):
在 Niagara 中,通过 Set Float Parameter 模块动态控制雾的密度:
混合控制蓝图
创建 Blueprint → 选择 Actor,命名为 `BP_WeatherController`。
在 Event Graph 中:
1. 添加 Niagara Component 组件,分别引用三个 System:`NS_Rain_GPU`、`NS_Snow_GPU`、`NS_Fog_Volume`
2. 暴露三个 Float 变量:`RainIntensity`、`SnowIntensity`、`FogDensity`
3. 在 Tick 事件中,用 Set Niagara Variable 节点动态调整粒子生成速率:
// 伪代码示例
if (RainIntensity > 0.1)
{
Set Niagara Variable (RainSystem, "SpawnRate", RainIntensity * 50000);
ActivateSystem(RainSystem);
}
else
{
DeactivateSystem(RainSystem);
}
—
四、进阶技巧:动态过渡与性能平衡
雨雪渐变(Lerp 过渡)
在蓝图中,用 Lerp 节点实现 0→1 的过渡:
这样玩家从晴天进入雨区时,不会看到粒子瞬间出现。
LOD 优化
对于移动端或低配 PC,实现 Distance-based LOD:
通过 Camera Distance 判断,距离 > 5000 厘米时切换到 Level 1。
与场景交互
想让雨滴打到地面产生涟漪?可以:
1. 在场景中放置 Decal 或 Niagara Ribbon
2. 使用 Collision 模块检测雨滴与地面碰撞
3. 触发 Spawn Burst 生成涟漪粒子(参考官方 Content Examples 中的 `FX_Rain`)
—
五、总结与进阶建议
这套系统已经经过火星人教育多个班级的验证,学员反馈性能稳定、效果真实。但天气系统远不止于此——你可以继续探索:
学习建议:
1. 先跑通基础案例,再逐步添加细节(比如雨滴涟漪、雪地堆积)
2. 多利用 UE5 的 Niagara Debugger 查看粒子生命周期
3. 研究官方 Content Examples 项目中的 `FX_Rain` 和 `FX_Snow` 地图
如果你在操作中遇到问题,欢迎在评论区留言,我会在下次直播中解答。
—
常见问题 FAQ
Q1:为什么我的雨滴看起来像在飘,而不是下落?
A:检查 Gravity 模块的 Z 轴加速度是否设置为负值(如 -980)。另外,Curl Noise Force 的 Strength 不要设置过大,建议 X/Y 不超过 100。
Q2:粒子数量一高就卡顿,如何优化?
A:首先确认 Simulation Target 是 GPU Compute Sim。其次,在 Renderer 中关闭 Motion Blur 和 Depth Fade。如果还卡,降低 Spawn Rate 到 20000,并启用 LOD。
Q3:雪和雾同时开启时,画面过亮怎么办?
A:调整雾材质的 Density 参数,建议从 0.1 开始微调。同时,雪粒子的 Alpha 不要超过 0.6,避免叠加后过曝。
Q4:如何让雨滴有真实的倾斜效果?
A:在 Initialize Particle 中,将 Sprite Rotation 绑定到 Wind 方向。或者使用 Mesh Renderer 替代 Sprite,用圆锥体模型模拟雨滴形状。
Q5:系统在移动端运行崩溃,怎么办?
A:移动端建议粒子数不超过 10000,并禁用 Curl Noise Force。改用 Simple Gravity 模块,同时将材质复杂度降到最低(只用 Base Color 和 Opacity)。

评论(0)