~2 мин чтения

3D-аудио и AudioMixer

AudioSource, AudioListener, 3D-затухание и маршрутизация через миксер.

Звук в 3D-игре — не просто mp3 в фоне. Это пространственное звучание: шаги слева, выстрел за спиной, шёпот за стеной. Unity даёт встроенный 3D-аудиодвижок, для большинства задач достаточный.

Главные компоненты

  • AudioListener — “уши” в сцене. Один на сцену. По умолчанию висит на главной Camera.
  • AudioSource — источник звука. Прикрепляется к GameObject. Воспроизводит AudioClip.
  • AudioClip — ассет с импортированным wav/mp3/ogg.
public class Footsteps : MonoBehaviour
{
    [SerializeField] private AudioSource source;
    [SerializeField] private AudioClip[] clips;

    // Вызывается из Animation Event
    public void Footstep_AnimEvent() {
        var clip = clips[Random.Range(0, clips.Length)];
        source.pitch = Random.Range(0.95f, 1.05f);
        source.PlayOneShot(clip);
    }
}

PlayOneShot хорош тем, что не прерывает уже играющий звук — несколько шагов могут звучать наложением. Просто source.Play() сбросит текущее воспроизведение.

3D vs 2D звук

У AudioSource есть слайдер Spatial Blend: 0 = 2D (играет одинаково, где бы ни был слушатель), 1 = 3D (зависит от расстояния и направления). Музыка и UI — обычно 2D, диегетические звуки (выстрелы, шаги) — 3D.

Для 3D-режима настраиваются:

  • Min Distance / Max Distance — на каком расстоянии громкость максимальна и где она падает в ноль.
  • Volume Rolloff — кривая затухания: Linear, Logarithmic, Custom.
  • Spread — насколько широко источник “размазан” в стерео.
  • Doppler Level — насколько применять эффект Доплера при движении.
Логарифмическое затухание реалистично

Звук в реальности падает по обратному квадрату расстояния — это близко к Logarithmic. Linear проще управляется, но звучит фейково. Для важных звуков (выстрелы) используйте Logarithmic с тонкой настройкой Min/Max.

AudioMixer — маршрутизация и эффекты

AudioMixer — отдельный ассет (Create → Audio Mixer), описывающий каналы (groups). Стандартная структура — Master → Music + SFX + Voice. У каждого канала — громкость, экспонируемая в код:

[SerializeField] private AudioMixer mixer;

public void SetMusicVolume(float linear) {
    // Преобразуем линейную громкость в дБ
    float db = linear > 0.0001f ? Mathf.Log10(linear) * 20f : -80f;
    mixer.SetFloat("MusicVolume", db);
}

Параметры миксера (“MusicVolume”) нужно вручную “Expose to Script” — клик правой кнопкой на слайдере группы → Expose.

К каналу можно подключить эффекты: low-pass filter, reverb, compressor. Удобно для:

  • Подводный эффект (low-pass на Master, когда игрок под водой).
  • Реверберация в комнате (Reverb Zone + reverb-эффект в миксере).
  • Глушение SFX, когда играет диалог (sidechain через duck volume).

AudioSource.PlayClipAtPoint — одноразовый источник

Удобный helper, когда нужно проиграть звук в точке и забыть:

AudioSource.PlayClipAtPoint(_explosionClip, transform.position, volume: 1f);

Unity создаст временный GameObject с AudioSource, проиграет и уничтожит. Не подходит для контроля звука (нельзя остановить, изменить громкость на лету), но идеален для коротких эффектов.

AudioMixer Snapshots — состояния микшера

Snapshot — это именованное состояние всех слайдеров и эффектов микшера. Через AudioMixer можно плавно блендить между snapshot’ами — это main path для “ducking” музыки во время диалогов, смены атмосферы при входе в комнату, ducking SFX в paused state.

В Audio Mixer-окне:

  1. Создайте AudioMixer (если ещё нет) → правый клик на нём → Add Snapshot.
  2. Сохраните несколько snapshot’ов: Default, Underwater, Paused, Combat.
  3. В коде вызывайте snapshot.TransitionTo(duration):
[SerializeField] private AudioMixerSnapshot defaultSnap;
[SerializeField] private AudioMixerSnapshot underwaterSnap;

public void OnEnterWater() {
    underwaterSnap.TransitionTo(0.5f); // 0.5 секунды плавного перехода
}

public void OnExitWater() {
    defaultSnap.TransitionTo(0.5f);
}

Снапшот не просто меняет громкость — он переключает все экспонируемые параметры и состояния эффектов (включение/выключение low-pass, EQ-кривые и т.д.). Это быстрее и аккуратнее, чем менять параметры по одному из кода.

Подводные камни

  1. Один AudioListener. Если случайно появилось два (например, в обоих сценах при аддитивной загрузке), будет варнинг и звук может звучать странно. Проверяйте в редакторе.
  2. Сжатие на мобильных. mp3/ogg распакуется на лету. Для коротких звуков ставьте Load Type: Decompress On Load (один раз распакуется, в памяти PCM). Для длинных — Streaming.
  3. Forced To Mono. Если 3D-звук импортирован как стерео, Unity может “потерять” пространственный эффект — конкретный канал стерео всегда играет с одной стороны. Включайте Force To Mono для 3D SFX.

В следующей главе — UI: HUD, меню, диалоги, и как они вообще существуют в 3D-сцене.