Works in Unreal Engine 5.0 to 5.8. Updated November 2026.
Quick answer: play 4 to 6 loops recorded at different RPMs at once in a MetaSound. From Blueprint, give each loop a gain that peaks at its own RPM and fades to zero at its neighbours, and pitch each one to match the current RPM.
You need loops recorded at steady RPMs: for example 1000, 2500, 4000 and 5500 RPM, each 3 to 8 seconds and looping cleanly. Ideally record each one twice: on load (pulling hard) and off load (coasting).
Step 1: Build the MetaSound
- Create a MetaSound Source, Mono output, named
MS_EngineLoops. - For each loop, add a Wave Player (Mono) with Loop ticked, its Play from On Play.
- Add float inputs
Pitch0…Pitch3andGain0…Gain3. Connect eachPitchto its player’s Pitch Shift. - Add a Mono Mixer (4). Connect each player to In N and each
Gaininput to Gain N (Lin). Send the mixer out to Out Mono.
Step 2: Work out the gains in Blueprint
For each loop recorded at LoopRPM, with Spacing the RPM between neighbouring loops (1500 here):
Weight = Clamp(1 - Abs(RPM - LoopRPM) / Spacing, 0, 1)
Gain = Sqrt(Weight) // equal power: no dip between loops
Pitch = 12 * Log(RPM / LoopRPM, 2) // semitones
On Event Tick, read Get Engine Rotation Speed from the Chaos movement component, compute these for each loop and send them with Set Float Parameter (Gain0, Pitch0 and so on).
Only two loops are ever audible at once, so each one is pitched by less than one step. That’s what removes the chipmunk effect.
Step 3: Add the off-throttle set
Duplicate the four players for the off-load loops and mix them with gains multiplied by 1 − Throttle, while the on-load gains are multiplied by Throttle. Lifting off now sounds hollow instead of just quieter.
Two loops at different points of the engine cycle can sound “phasey” or washed out where they overlap. Loops recorded closer together (every 500 RPM) and normalised to the same level help. This is the main weakness of the loop method.
| Problem | Fix |
|---|---|
| Volume dips between loops | Use the square root (equal power) gains above |
| Phasey, chorus-like blend | Record closer RPM steps, or narrow the crossfade zone |
| Clicks when looping | Trim each loop at a zero crossing, or crossfade its ends in your editor |
In our Any Car Engine plugin, we synthesize the rev range instead of crossfading loops.
FAQ
How many loops do I need? Four to six per load is a good start. Every 500 RPM below 3000 and every 500 to 1000 above gives the smoothest result.
Is playing eight Wave Players expensive? Not for the player’s car. For many AI cars, use fewer loops or MetaSound virtualization.
Can I do this in a Sound Cue? Yes, with a Crossfade by Param node, but MetaSounds gives you per-loop pitch and gain from one graph.