ryzerrr's picture
Upload folder using huggingface_hub
40c0886 verified
|
Raw
History Blame Contribute Delete
3.9 kB

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 maxDistance is 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 AudioListener per 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 PlayOneShot is fine up to ~20 simultaneous clips.
  • Use compressed formats (Vorbis) for music; uncompressed (WAV) for frequent short SFX.
  • Set AudioClip.preloadAudioData = true for short clips and false for music that should stream from disk.
  • Lower maxDistance aggressively; large falloff radii cost CPU on 3D sounds.