How to Make Rain in Unreal Engine 5: Particles and Wet Surfaces

Table of Contents

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

  1. In the Content Browser, right-click and choose FX > Niagara System.
  2. Choose New system from selected emitter(s), pick the Fountain emitter and name the system NS_Rain.
  3. 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

ModuleSetting
Emitter PropertiesLocal Space off, Sim Target: GPUCompute Sim, Calculate Bounds Mode: Fixed with bounds of about 1500 × 1500 × 1000
Spawn Rate8000
Initialize ParticleLifetime 2, Sprite Size Mode: Non-Uniform, size (1, 45), a pale grey colour with alpha about 0.3
Shape LocationBox, size (2400, 2400, 10), offset Z 800 so drops start above the player
Add Velocity (add it under Particle Spawn)(0, 0, −900)
Sprite RendererAlignment: 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

  1. Open your character Blueprint and add a Niagara Particle System component. Set its asset to NS_Rain.
  2. 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

  1. Right-click > Materials > Material Parameter Collection. Name it MPC_Weather and add a scalar Wetness (default 0).
  2. 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).
  3. 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:

MissingWhy it’s hard
Dry ground under roofs and in tunnelsEach drop and each pixel needs to know if something is above it
Wet ground on every assetEvery master material, including marketplace ones, needs the wet nodes
Puddles that fill and dryPuddles should only form on soaked, flat ground and outlast the wet ground around them
Snow that builds up and meltsA second particle system plus cover that depends on temperature
Rain sound that muffles indoorsSee 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.

Related tutorials