
Play the same sword hit sound twenty times in a row and the game starts to feel like a prototype.
Nothing else changed — the art, the animation and the mechanics are identical — but the audio has told
the player this is not finished.
How many variations
| Sound type | Variations | Why |
|---|---|---|
| Melee impacts | 4–6 | Heard constantly, often several per second |
| Footsteps (per surface) | 6–8 | The most repeated sound in most games |
| UI clicks | 2–3 | Short and neutral; repetition is less noticeable |
| Gunshots | 4–6 | Plus a separate tail for indoor and outdoor |
| Damage grunts | 5–8 | Vocal sounds repeat most obviously of all |
| Death or defeat | 2–3 | Heard rarely; variety matters less |
| Pickups and rewards | 1–2 | Consistency is a feature here — it becomes recognisable |
The rule underneath: variation count should track how often the sound plays. A sound
the player hears three times per fight needs more variants than one they hear at the end of a level.
Stretching a small library
If a pack ships three variations where you want six, three techniques get you most of the way.
Pitch randomisation. Playing each variant at a random pitch between about 0.95 and
1.05 makes three sounds behave like nine. Beyond ±10% it starts sounding artificial, and on vocal sounds
the safe range is narrower.
Volume randomisation. A few decibels of variance, applied alongside pitch, reinforces
the effect. Subtle enough that nobody notices it directly.
Layering. Combine a constant base layer with a randomised detail layer. A sword hit
becomes one impact sound plus one of six metallic ring variations — three base sounds and six rings
gives eighteen distinct combinations from nine files.
Most engines support the first two natively: Unity’s audio source has pitch controls, Unreal’s Sound
Cue has a Random node with modulation, Godot has pitch_scale on the stream player.
Avoid immediate repeats
Random selection will occasionally play the same variant twice in a row, and that specific case is
what the ear notices. Keep track of the last one played and exclude it from the next draw — a few lines
of code that does more for perceived variety than adding two more files.
What to check in a library
- Variation count per sound, stated explicitly rather than implied by a total file
count - Consistent naming —
sword_hit_01through_06is what
lets you load a variation set programmatically - Normalised levels so one variant is not noticeably louder
- Dry versions as well as processed, so you can apply your own reverb per space
- 48 kHz source files — you can always downsample; you cannot add back
- Stream-safe status, if any of it is musical
Mixing so nothing gets lost
Variation solves repetition. A separate problem is that in a busy moment everything plays at once and
the player hears mud. The fix is a mix structure, and it is worth setting up before you have two hundred
sounds.
Bus structure
Route everything through named groups rather than playing sounds directly:
- Master
- Music
- SFX — combat, world, foley
- UI
- Voice
- Ambience
This gives you per-group volume sliders for free, and it is what lets you duck one group under another
when something important happens.
Ducking
When a critical sound plays — a boss roar, a voice line, a warning — temporarily lower everything else.
A few decibels for a fraction of a second is enough, and it makes the important thing audible without
raising its volume.
Both Unity’s audio mixer and Unreal’s sound classes support this natively through send/duck
configuration. Godot needs a small script on the bus, which is a few lines.
Voice limiting
Cap how many instances of one sound can play simultaneously. Ten enemies dying at once should not play
ten death sounds at full volume — two or three, with the rest suppressed, sounds better and costs less
CPU.
This is the single most effective fix for “the audio goes to mush in big fights”, and it is a setting
rather than a redesign.
Spatial audio basics
Three settings decide whether positioned sound helps or annoys:
- Rolloff distance. Too short and sounds pop in abruptly; too long and everything is
audible everywhere. Match it to how far the player can see. - Rolloff curve. Logarithmic is realistic; linear is easier to reason about for
gameplay. Most games want logarithmic for world sounds and 2D for UI. - Spatial blend. UI and music at 0 (fully 2D), world sounds at 1 (fully 3D). Mixing
these up is why UI clicks sometimes come from one side.
Loudness, and why it matters at launch
Games are increasingly expected to hit a consistent loudness target so players do not have to adjust
volume between titles. Around −23 LUFS integrated is a common reference for games, with peaks below
−1 dBTP.
Practical implication for asset use: a library normalised to −16 LUFS will sit noticeably louder than
one at −23, and mixing the two produces a game where some sounds jump out. Check what a library is
normalised to, and re-normalise if you are combining sources.
Randomising pitch and volume, and where the limits are
Pitch variation is the cheapest way to stretch a small set of samples, and it is also the easiest thing to overdo. A range of roughly ±5 to ±8 per cent reads as natural variation. Past about ±15 per cent the listener stops hearing a different footstep and starts hearing the same footstep played wrong, because the perceived size of the object changes with pitch: a pitched-down impact sounds like a heavier thing hit a heavier surface.
Volume randomisation is safer, but it works best in a narrow band too — around 2 to 3 dB. Beyond that, quiet instances get lost under the music and loud ones poke through the mix. The two together, applied to a set of four samples, is roughly as convincing as eight samples with no randomisation at all, at a fraction of the recording cost.
What randomisation cannot fix is a distinctive artefact in the sample itself. If one of your four footsteps has a faint click at the start, the player will pick that click out of the sequence within a minute regardless of pitch. Listen to each sample in isolation on headphones before it goes in the pool.
Layering: building many sounds from few
Most impactful game sounds are not one recording, they are three stacked: a transient that gives the hit its definition, a body that gives it weight, and a tail that places it in a space. Once a sound is built that way, each layer can be swapped independently. Four transients against three bodies against two tails is twenty-four combinations from nine files, and because the layers vary in different dimensions the results genuinely sound different rather than merely detuned.
This is also how you keep a weapon and its upgraded version related without recording twice. Keep the body, swap the transient for something brighter and add a short metallic tail; players hear the same gun, improved.
Distance, occlusion and why a good library still sounds flat
A frequent complaint about bought sound libraries is that everything sits at the front of the mix, all at the same distance. That is not usually the library’s fault. Dry, close-miked samples are exactly what you want to buy, because reverb baked into a sample cannot be removed but can always be added.
The work is on your side: an attenuation curve so volume falls off with distance, a low-pass filter that opens and closes as obstacles come between the source and the listener, and a reverb send that changes with the space the player is standing in. Ten minutes of that setup does more for perceived audio quality than a larger library will.
Naming so the set stays usable
A library with 800 files is only useful if you can find the one you want. Rename on import to a consistent scheme — sfx_footstep_gravel_01, sfx_impact_wood_heavy_03 — category first, specifics after, index last. It sorts correctly, it groups variations together automatically, and it means the random-container setup in your audio middleware is a matter of selecting a range rather than hunting through a vendor’s naming conventions.
Format and build size
Ship WAV for short, frequently-played sounds — decompression cost matters more than file size when a
sound plays fifty times a minute. Use compressed formats for music and long ambience, where the memory
saving is worth the decode.
Most engines let you set this per asset. The default is usually wrong in one direction or the other,
and it is worth a pass before shipping.
Our audio library lists variation counts and stream-safe status
per pack. Implementation questions are welcome on the
Game Audio board, and the streaming issue is covered in our
stream-safe music guide.
