Найти в Дзене

Unity 2D. Ruby's Adventure. Part 35

В этом части мы научимся использовать аудиофайлы для воспроизведения фоновой музыки или воспроизведения звука, когда Ruby получает урон или чинит робота.

Звуковая система Unity состоит из следующих составляющих:

Audio Clips (аудиоклипы) - это ресурсы, такие же как спрайты или скрипты. Вы можете импортировать аудиоклипы из аудиофайла с расширением mp3 или wav, и они будут находиться в папке вашего проекта. Аудиоклипы в наших ресурсах находятся в папке Audio.

Audio Source (источник звука) — это компонент, который позволяет воспроизводить аудиоклип в позиции игрового объекта, на котором он находится. В этом компоненте вы задаете аудиоклип, который будет проигрываться, а также всевозможные настройки, например, громкость звука или его повторение.

Audio Listener (аудио-прослушиватель) — это компонент, который определяет, где находится «слушатель» на сцене. По умолчанию он размещается на камере, поскольку игроки ожидают услышать что-то с позиции камеры. Если вы щелкнете по своей камере в иерархии, то увидите, что на ней есть компонент Audio Listener. Без этого компонента вы не услышите ничего в своей игре, поскольку он является как бы "колонками", которые транслируют звуки объектов, которые находятся вблизи слушателя. Слушатель, прикрепленный к камере транслирует звуки всех объектов, находящихся в видимости камеры.

Начнем с создания фоновой музыки, которая будет звучать постоянно:

Создайте пустой игровой объект , назовите его BackgroundMusic и добавьте к нему компонент Audio Source. Перетащите аудиоклип из папки Audio под названием 2D MUSIC LOOP в свойство AudioClip объекта BackgroundMusic.

Обязательно установите флажок «Зациклить», чтобы музыка начала воспроизводиться снова, когда достигнет конца.

Проверьте ползунок «Spatial Blend» (пространственное смешение), который может изменяться от 2D (левая сторона) до 3D (правая сторона).

Этот ползунок определяет, является ли звук пространственным или нет. Если ползунок полностью установлен в положение 2D, то звук будет воспроизводиться на одном и том же уровне независимо от того, где находится аудио прослушиватель. Если ползунок полностью установлен в положение 3D, то звук будет воспроизводиться больше или меньше в правом/левом динамике в зависимости от того, где находится источник звука по отношению к аудио прослушивателю.

Поскольку у нас музыка должна быть одинаковой везде, убедитесь, что ползунок установлен в положение 2D.

Настройка звука
Настройка звука

Запустите игру и вы услышите музыку. Можете настроить ползунок Volume у компонента Audio Source на свое усмотрение.

Если во время разработки вам по какой-либо причине необходимо отключить весь звук, нажмите кнопку отключения звука в правом верхнем углу экрана игры. Если вы не слышите звука, хотя он должен быть, стоит проверить, включена ли эта кнопка.

Настройки звука
Настройки звука

Теперь попробуем реализовать воспроизвести звука один раз, когда что-то происходит, например, когда персонаж получает коллекционный предмет здоровья.

Для этого будем использовать метод компонента AudioSource под названием PlayOneShot, который принимает аудиоклип в качестве своего первого параметра и воспроизводит его один раз со всеми настройками и в позиции текущего AudioSource.

Таким образом, вы можете добавить AudioSource к игровому объекту Ruby и использовать этот источник звука для воспроизведения всех звуков, связанных с игровыми действиями, которые выполняет Руби, например, когда он берет аптечку, бросает шестеренку или получает удар.

Итак, добавьте компонент AudioSource персонажу Ruby. Затем откройте скрипт RubyController и добавьте непубличную переменную audioSource типа AudioSource, чтобы связать с этой переменной соответствующий компонент в методе Start.

AudioSource audioSource;

audioSource= GetComponent<AudioSource>();

Давайте напишем функцию PlaySound, которая принимает AudioClip в качестве входного параметра и просто вызовет PlayOneShot для AudioSource:

public void PlaySound(AudioClip clip)

{

audioSource.PlayOneShot(clip);

}

Проверьте скрипт и сохраните его:

Скрипт персонажа
Скрипт персонажа

Теперь откройте скрипт HealthCollectible и добавьте публичную переменную типа AudioClip с именем collectClip. А затем вызовите метод PlaySound с клипом collectClip для Ruby в тот момент, когда уничтожаете ягоду:

public AudioClip collectedClip;

controller.PlaySound(collectedClip);

Проверьте и сохраните клип:

Скрипт объекта здоровья
Скрипт объекта здоровья

Проверьте префаб ягоды, в нем появится новое свойство Collected Clip в компоненте HealthCollectible. Перетащите аудиоклип Collectable, который из папки Audio в этот слот.

Настройка префаба
Настройка префаба

Запустите игру и проверьте, что при сборе ягоды звучит единичный звук сбора. Не забывайте, что прежде чем собрать ягоду, необходимо снять у Ruby немного здоровья!

Почему мы используем источник звука на Ruby, а не на ягоде? Потому что источник звука — это компонент. Когда Руби хватает предмет коллекционирования, он уничтожается. Это также приведет к уничтожению источника звука и прекращению воспроизведения звука.

Воспроизводя звук через источник звука на Ruby, звук можно воспроизвести, даже если коллекционный предмет будет уничтожен.

В качестве упражнения вы можете самостоятельно попробовать добавить звук, когда Руби бросает шестеренку или когда шестеренка сталкивается с роботом.

Если не получится, то проверьте свой алгоритм действий для броска шестеренки:

  • Добавьте публичную переменную hittedClip типа AudioClip в скрипт RubyController для хранения звука броска и свяжите с этой переменной клип Hit for enemy 1 или 2;
  • Вызовите PlayOneShot с клипом hittedClip в качестве входного параметра, в методе Launch скрипта RubyController;

Проверьте и сохраните скрипт:

Скрипт Ruby
Скрипт Ruby

До сих пор мы использовали 2D-звук. Он воспроизводится с одинаковой громкостью независимо от того, где находится персонаж по сравнению с источником. Но часто необходимо, чтобы в игровом мире присутствовал звук, источник которого перемещается, а значит и слышать мы его должны по разному, в зависимости от расстояния. Например, у нас есть робот, который ходит. Громкость звука движения робота должна увеличиваться, когда он подходит ближе к камере и уменьшаться, когда он уходит в угол игровой сцены.

Для реализации такой динамической смены громкости откройте префаб робота Enemy и добавьте к нему компонент AudioSource. Установите в свойство AudioClip этого компонента клип Robot Walking_Broken из папки Audio. Установите флажок Loop и переместите ползунок Spatial Blend до конца вправо в положение 3D, чтобы сделать звук пространственным.

Настройка робота
Настройка робота

На сцене префаба вы увидите синий круг вокруг значка динамика. Это минимальное расстояние настройки пространственного смешения. Если аудиопрослушиватель другого объекта находится внутри этого круга, то мы услышим звук на максимальной громкости. При выходе объекта из этого круга звук будет затухать, пока совсем не пропадет.

Можно настроить это круг при помощи мышки, перетаскивая маленькие синие кружочки на этом круге. А можно сделать это через инспектор - в нижней части инспектора источника звука откройте раздел «3D Sound Settings», измените параметр Max Distance на 10, чтобы круг стал размером поменьше. Таким образом, в этой настройке, если слушатель находится ближе, чем на 1 единицу от источника, то игрок будет слышать звук на максимальной громкости, если на расстоянии 5 единиц, то на половине громкости, а дальше, чем на 10 единиц от источника, звук будет отключен.

Сохраните префаб и вернитесь в сцену. Если вы запустите игру, то затухания звука не сработают потому, что звуковая система создана для 3D. И тот круг, который мы настраивали на самом деле является сферой.

Вы можете переключить вид сцены на 3D , чтобы отобразить эту сферу:

Сфера звуковой системы
Сфера звуковой системы

А камера расположена немного выше всей игры. Таким образом, даже если робот находится в центре экрана, а камера находится прямо над ним, то прослушиватель звука на камере все равно находится на максимальном расстоянии от источника звука, и значит затухание максимальное и звук не слышен!

Чтобы это исправить, нужно разместить Audio Listener на той же высоте z = 0, что и остальные игровые объекты.

Мы не можем изменить положение камеры, так как тогда не увидим игровую сцену. Вместо этого мы создадим дочерний игровой объект для камеры, который будет двигаться вместе с камерой всегда в центре экрана, но затухание звука будет рассчитываться правильно на основе 2D- расстояния .

Выберите основную камеру и создайте новый пустой игровой объект в качестве дочернего. Назовите его Listener, добавьте к нему компонент Audio Listener и установите его координаты в Transform на x = 0 , y = 0 и z = 10.

Помните, что позиция, установленная дочернему объекту, задается относительно родительского объекта, таким образом сама камера находится на расстоянии по оси Z на -10, а дочерний объект размещается перед камерой на расстоянии -10 + 10 = 0, то есть в позиции z = 0.

Кликните в инспекторе камеры правой кнопкой мыши мыши по аудиопрослушивателю и выберите «Remove Component» .

Теперь, если запустите игру, то звук ходьбы робота будет пространственно распределен (воспроизводится слева или справа) и затухать, когда робот отойдет дальше от центра экрана, как и ожидалось.

На этом настройка звука в игре завершена.