Unity Audio
Unity plays audio through AudioSource components that reference an
AudioClip asset. A single AudioListener in the scene is required
(usually on the Main Camera).
AudioClip
An AudioClip is the audio data. Supported formats: WAV (uncompressed,
fastest), MP3/Ogg Vorbis (compressed, smaller). Unity imports them and
lets you choose compression per-platform in the import settings.
AudioSource
var src = gameObject.AddComponent<AudioSource>();
src.clip = jumpClip;
src.volume = 0.7f;
src.pitch = 1.0f;
src.loop = false;
src.playOnAwake = false;
src.spatialBlend = 0.0f; // 0=2D, 1=3D
src.Play();
Important properties:
| Property | Meaning |
|---|---|
clip |
The AudioClip to play |
volume |
0..1 |
pitch |
Default 1; >1 = higher pitch, <1 = lower |
loop |
Repeat when the clip ends |
playOnAwake |
Play automatically when the AudioSource is enabled |
spatialBlend |
0=fully 2D, 1=fully 3D (position-based) |
minDistance |
Within this distance the sound is at full volume (3D) |
maxDistance |
Beyond this distance the sound is inaudible (3D) |
rolloffMode |
Logarithmic, Linear, or custom curve (3D falloff) |
3D audio
For positional sounds (footsteps, gunfire, engines), set
spatialBlend = 1.0f. The volume then depends on the distance between the
AudioSource and the AudioListener.
src.spatialBlend = 1.0f;
src.rolloffMode = AudioRolloffMode.Logarithmic;
src.minDistance = 1f;
src.maxDistance = 50f;
Default
maxDistanceis 500 -- way too large for most gameplay. Lower it to 30-50 for SFX.
One-shot SFX
For short sound effects (pickups, gunshots, impacts) use PlayOneShot:
audioSource.PlayOneShot(clip, volumeScale);
PlayOneShot can layer multiple clips on the same AudioSource without
cutting each other off.
AudioMixer
For volume control and grouping, create an AudioMixer asset
(Assets > Create > Audio Mixer). Expose parameters and control them at
runtime:
[SerializeField] private AudioMixer mixer;
public void SetMasterVolume(float dB) => mixer.SetFloat("MasterVolume", dB);
public void SetMusicVolume(float dB) => mixer.SetFloat("MusicVolume", dB);
public void SetSfxVolume(float dB) => mixer.SetFloat("SfxVolume", dB);
Convert linear 0..1 to dB:
public static float LinearToDB(float linear) =>
linear <= 0.0001f ? -80f : Mathf.Log10(linear) * 20f;
The AudioManager pattern
The generated AudioManager.cs is a singleton with two channels
(sfxSource, musicSource). It exposes:
AudioManager.Instance.PlaySfx(pickupClip, 1.0f);
AudioManager.Instance.PlayMusic(menuMusic);
AudioManager.Instance.StopMusic();
AudioManager.Instance.ApplyVolumes();
DontDestroyOnLoad keeps the manager alive across scene loads so music
does not restart.
AudioListener
- Exactly one
AudioListenerper scene. The Main Camera has one by default; remove it if you add another. - The listener's transform defines "where the player's ears are" for 3D audio panning.
Performance
- Pool AudioSources for sounds that play many times per second (machine
guns, rain). Reusing one AudioSource and calling
PlayOneShotis fine up to ~20 simultaneous clips. - Use compressed formats (Vorbis) for music; uncompressed (WAV) for frequent short SFX.
- Set
AudioClip.preloadAudioData = truefor short clips andfalsefor music that should stream from disk. - Lower
maxDistanceaggressively; large falloff radii cost CPU on 3D sounds.