Works in Unreal Engine 5.0 to 5.8. Updated November 2026.
Quick answer: make a Niagara system of thin streaks falling at about 900 cm/s that follows the player. Then add a Material Parameter Collection with a Wetness value that darkens your materials and makes them glossy.
Step 1: Create the rain system
- In the Content Browser, right-click and choose FX > Niagara System.
- Choose New system from selected emitter(s), pick the Fountain emitter and name the system NS_Rain.
- Open it. In Particle Spawn, delete Add Velocity in Cone. In Particle Update, delete Gravity Force and Drag.
You now have a fountain that does nothing. The next steps turn it into rain.
Step 2: Make the drops fall
| Module | Setting |
|---|---|
| Emitter Properties | Local Space off, Sim Target: GPUCompute Sim, Calculate Bounds Mode: Fixed with bounds of about 1500 × 1500 × 1000 |
| Spawn Rate | 8000 |
| Initialize Particle | Lifetime 2, Sprite Size Mode: Non-Uniform, size (1, 45), a pale grey colour with alpha about 0.3 |
| Shape Location | Box, size (2400, 2400, 10), offset Z 800 so drops start above the player |
| Add Velocity (add it under Particle Spawn) | (0, 0, −900) |
| Sprite Renderer | Alignment: Velocity Aligned, so each sprite stretches along its fall |
Real raindrops fall at about 9 m/s. Thin, long sprites read as the motion-blurred streaks the eye actually sees. To slant the rain in the wind, give Add Velocity some X or Y.
Drops disappear when you turn the camera? GPU emitters need fixed bounds. Make the bounds cover the whole spawn box and the fall distance.
Step 3: Follow the player
- Open your character Blueprint and add a Niagara Particle System component. Set its asset to NS_Rain.
- Because Local Space is off, the box moves with you but each drop keeps falling where it spawned.
To control how hard it rains, add a float User Parameter named Intensity to NS_Rain. Set Spawn Rate to Intensity × 8000. From Blueprint, call Set Niagara Variable (Float) with the name User.Intensity.
Step 4: Make surfaces wet
- Right-click > Materials > Material Parameter Collection. Name it MPC_Weather and add a scalar Wetness (default 0).
- In your master material, add a Collection Parameter node reading Wetness. Wire Base Color = Lerp(your colour, your colour × 0.5, Wetness) and Roughness = Lerp(your roughness, 0.1, Wetness).
- In a Blueprint that knows it’s raining, on Tick, move Wetness toward its target and write it:
Wetness = FInterp To Constant(Wetness, Target, DeltaSeconds, 0.02)
Set Scalar Parameter Value (MPC_Weather, "Wetness", Wetness)
An interp speed of 0.02 per second takes about 50 seconds to soak dry ground. Use a slower speed when Target goes back to 0, because ground dries slower than it wets.
What this simple version doesn’t do
If your game has one rainy level and you own all the materials, the steps above may be all you need. Bigger worlds run into these:
| Missing | Why it’s hard |
|---|---|
| Dry ground under roofs and in tunnels | Each drop and each pixel needs to know if something is above it |
| Wet ground on every asset | Every master material, including marketplace ones, needs the wet nodes |
| Puddles that fill and dry | Puddles should only form on soaked, flat ground and outlast the wet ground around them |
| Snow that builds up and melts | A second particle system plus cover that depends on temperature |
| Rain sound that muffles indoors | See Weather Sounds in Unreal Engine 5 |
We do this in our Any Weather plugin.
FAQ
Why does it rain inside my building?
This setup doesn’t know about roofs. Turn the rain component off in a trigger volume at the door, or use a depth capture from above to remove drops under cover.
Can I make snow the same way?
Yes. Use a slower fall (about 100 cm/s), small round sprites with Alignment: Unaligned, and add Curl Noise Force so flakes drift.
Will this slow down my game?
GPU sprites are cheap, but 8000 per second still adds up. Scale Spawn Rate with your graphics settings.