Звук: AudioSource, AudioClip и музыка

Звук превращает набор картинок в живую игру. Прыжок без «бдыщ», монета без «дзынь» — это совсем не то. Разберём, как Unity проигрывает звук.

Суть: звук в Unity — это пара: AudioClip (файл звука) и AudioSource (компонент-«колонка», который его проигрывает). Короткие эффекты играют через PlayOneShot, фоновую музыку — через зацикленный AudioSource. Чтобы было что слышать, на сцене нужен AudioListener (он есть на камере).

Звук в Unity устроен как настоящая аудиосистема. Есть звуковой файлAudioClip (импортированный wav/ogg/mp3). И есть источникAudioSource, компонент-колонка на объекте. Чтобы услышать звук, нужен ещё слушательAudioListener, который по умолчанию висит на главной камере (как «уши» игрока).

Различают два сценария. Эффекты (прыжок, выстрел, подбор) — короткие, играют поверх друг друга; для них есть PlayOneShot. Музыка — длинная, зациклена (loop), играет фоном на отдельном AudioSource.

Как работает под капотом

AudioListener (на камере = "уши")
        ^
        |  слышит
        |
  AudioSource (колонка)  +  AudioClip (звуковой файл)
        |
   PlayOneShot(clip)  -> разовый эффект (прыжок, монета)
   loop=true, Play()  -> фоновая музыка по кругу

Звук бывает 2D (одинаково слышен везде — UI, музыка) и 3D (тише вдалеке, есть направление — для мира). Это задаёт параметр Spatial Blend у AudioSource.

using UnityEngine;

public class SoundFx : MonoBehaviour
{
    [SerializeField] private AudioClip coinClip;
    private AudioSource audioSource;

    void Awake() { audioSource = GetComponent<AudioSource>(); }

    public void PlayCoin()
    {
        audioSource.PlayOneShot(coinClip);   // разовый эффект
    }
}

Управление громкостью — это математика микса. Смоделируем на Python расчёт итоговой громкости с учётом общего, музыкального и мастер-уровней:

# Итоговая громкость = клип * канал * мастер, ограничено [0, 1]
def final_volume(clip_vol, channel_vol, master_vol):
    v = clip_vol * channel_vol * master_vol
    return max(0.0, min(1.0, v))     # не выйти за пределы

# Звук монеты: громкий клип, канал эффектов 80%, мастер 50%
print("Монета:", final_volume(1.0, 0.8, 0.5))
# Музыка: тихий клип, канал музыки 60%, мастер 50%
print("Музыка:", final_volume(0.7, 0.6, 0.5))
# Игрок убавил всё в ноль
print("Тишина:", final_volume(1.0, 1.0, 0.0))

Та же логика на Python ▶ — итоговая громкость это произведение уровней, ограниченное диапазоном 0..1. Так работают аудио-миксеры: один общий ползунок мастер-громкости управляет всеми каналами сразу.

Частые ошибки

  • Нет AudioListener. Удалил камеру с листенером — звука нет. На сцене должен быть ровно один активный AudioListener.
  • Музыка через PlayOneShot. PlayOneShot не зацикливает. Для фоновой музыки ставь loop=true и зови Play().
  • Звук обрывается при уничтожении объекта. Если AudioSource был на пуле, которая уничтожается, звук выстрела оборвётся. Для коротких эффектов используют отдельный «звуковой» объект.
  • Тяжёлый mp3 для частых эффектов. Короткие эффекты лучше как несжатый/легко декодируемый формат, чтобы не было задержки.

Best practices

  • Эффекты — через PlayOneShot; музыку — отдельный зацикленный AudioSource.
  • Используй Audio Mixer и группы (Music, SFX), чтобы дать игроку раздельные ползунки громкости.
  • 2D-звук — для UI и музыки; 3D — для звуков в мире (взрывы, шаги), чтобы они зависели от расстояния.

Итоги: звук — это AudioClip (файл) + AudioSource (колонка) + AudioListener (уши на камере). Эффекты играют через PlayOneShot, музыку — через зацикленный источник. Итоговая громкость — произведение уровней клипа, канала и мастера. Раздели каналы Music и SFX через Audio Mixer.

Audio Mixer и снапшоты

Когда звуков становится много, управлять громкостью каждого источника по отдельности невозможно. Поэтому в Unity есть Audio Mixer — пульт с каналами (группами), куда направляют звуки: отдельно музыка, отдельно эффекты, отдельно голоса. Один ползунок группы управляет всеми звуками внутри неё разом — ровно так в настройках игр появляются раздельные регуляторы «Музыка» и «Эффекты». Микшер умеет и эффекты: эхо, приглушение, фильтры. Особенно полезны снапшоты — сохранённые наборы настроек микса, между которыми можно плавно переходить: например, при паузе игра плавно приглушает игровые звуки и поднимает музыку меню. Для первой игры хватит двух групп — Music и SFX, — но знай, что под капотом Unity даёт полноценную студийную аудиосистему, к которой ты дорастёшь по мере усложнения проекта.

Проверьте себя
1. Какая пара компонентов нужна, чтобы проиграть звук в Unity?
ARigidbody и Collider
BAudioClip (файл) и AudioSource (источник)
CCanvas и Text
DTransform и Camera
2. Чем играют короткий разовый эффект (например звук монеты)?
Aloop = true и Play()
BPlayOneShot(clip)
CDebug.Log()
DInstantiate()