Part 16 https://dzen.ru/a/Y84jhrk9K0N-nmEo
Мы почти закончили игру, но в ней не хватает фоновой музыки и звуковых эффектов, что оживит нашу игру и поможет в создании зловещей атмосферы.
Прежде чем мы начнем добавлять звук в игру, давайте кратко рассмотрим, как работает звук в Unity. Есть три основных составляющих: аудиоклип, аудиоисточник и аудиослушатель.
- Аудиоклипы (Audio Clips) — это ассеты, такие как MP3, которые содержат все данные, относящиеся к конкретному звуку.
- Аудиоисточники (Audio Sources)— это компоненты, которые действуют как источник звука в игровом мире. Большинство вещей, которые воспроизводят звук в игре, должны иметь компонент Audio Source, чтобы у звука было местоположение.
- Аудиослушатель (Audio Listener) — это отдельный компонент сцены, который работает как виртуальные уши игрока (точно так же, как компонент Camera работает как виртуальные глаза игрока). По умолчанию компонент Audio Listener находится на основной камере.
Эти разные части обычно работают вместе следующим образом: источник звука (Audio Sources) воспроизводит аудиоклип (Audio Clips), и если прослушиватель звука (Audio Listener) находится достаточно близко к источнику звука, то звук слышен.
Свойство Spatial Blend (пространственное наложение) определенного источника звука определяет, звучит ли он так, как будто он исходит из определенной точки игрового мира, или он одинаково громкий независимо от расстояния между источником и прослушивателем звука.
Мы будем использовать два разных типа звуков:
- Недиегетический звук, источник которого не идентифицируется (например, фоновая музыка).
- Диегетический звук, который имеет конкретный источник (например, звук выстрела из оружия).
Давайте начнем с добавления недиегетического звука в игру. Поскольку у этого звука нет источника, его Spatial Blend (пространственное наложение) должно быть установлено в 2D . Когда пространственное смешение установлено как 2D, расстояние между источником звука и прослушивателем звука не влияет на громкость. Если для пространственного смешения источника звука выбрано 3D, громкость будет меняться в зависимости от расстояния до устройства прослушивания звука. Значения между 2D и 3D изменяют силу этого эффекта.
Мы добавим в игру три недиегетических звука:
- Трек в стиле эмбиент, который зациклится и создаст общую атмосферу дома с привидениями;
- Звуковой эффект, который воспроизводится, когда Джон Лимон попадается;
- Звуковой эффект, который воспроизводится, когда Джону Лимону удается сбежать.
Создайте пустой игровой объект и переименуйте его в Ambient. В Инспекторе установите положение Ambient на (0, 0, 0). Положение GameObject технически не имеет значения, поскольку громкость звука будет одинаковой, где бы он ни находился. Тем не менее, всегда полезно упорядочивать игровые объекты позиционно на случай, если это понадобится позже.
Далее нужно добавить компонент Audio Source. Можно сделать это при помощи кнопки «Добавить компонент» и в созданном компоненте задать свойство ресурса на нужный аудиоклип. Но удобнее просто перетащить мышкой нужный аудиоклип на объект Ambient. В окне проекта перейдите в Assets > Audio . Перетащите аудиоклип SFXHouseAmbience из окна проекта в окно инспектора прямо на объект Ambient, что автоматически добавит нужный компонент источника звука и привяжет этот аудиоклип к нему.
Свойство Spatial Blend уже установлено в 2D, поэтому вам не нужно его изменять.
Свойство Play on Awake (воспроизведение при пробуждении) также включено по умолчанию. Это означает, что как только уровень начнется, звук начнет воспроизводиться.
Однако по умолчанию звук останавливается после однократного проигрывания. Установите флажок Loop , чтобы зациклить фоновую музыку для игры.
Фоновая музыка должна звучать в игре не сильно громко, чтобы на фоне нее мы смогли услышать другие звуки, поэтому в инспекторе установите для свойства Volume компонента Audio Source значение 0.5.
Теперь в вашем доме с привидениями есть жуткий фоновый звук! Войдите в режим воспроизведения и убедитесь, что звук воспроизводится правильно.
Теперь продублируйте объект Ambient два раза, кликнув на нем правой клавишей и выбрав пункт Duplicate.
Переименуйте первую копию в Escape, а вторую в Caught.
Объект Escape будет отвечать за звук при выигрыше, перетащите мышкой аудиоклип SFXWin в свойство AudioClip этого объекта.
Объект Caught будет отвечать за звук при проигрыше, аналогично перетащите мышкой аудиоклип SFXGameOver в свойство AudioClip этого объекта.
Остальные настройки этих двух объектов будут одинаковыми, поэтому выберем их вместе при помощи удерживаемой клавиши Ctrl, что позволит нам сразу настроить оба объекта одинаково.
Эти звуки не должны воспроизводиться сразу при запуске уровня, и не должны зацикливаться.
- Снимите флажок Play on Awake (воспроизвести при пробуждении)
- Снимите флажок Loop (зацикливание)
Также эти звуки должны быть слышны поверх других звуков в игре, поэтому должны быть громче фоновой музыки.
Установите значение громкости на 1.
И теперь сразу приведем в порядок аудиоисточники. Для этого в окне иерархии создайте пустой GameObject и переименуйте его в Audio. В Инспекторе установите положение Audio на (0, 0, 0). Выберите игровые объекты Ambient, Escape и Caught, удерживая Ctrl и кликая каждый из них. Перетащите выбранные игровые объекты на объект Audio, чтобы сделать его родительским.
Давайте перейдем к реализации звуков окончания игры в скрипте GameEnding. Откройте этот скрипт для редактирования.
Нам необходимо при вызове метода EndLevel добавить воспроизведение источника звука. Есть два разных аудиоисточника (выигрыш и проигрыш), которые могут воспроизводиться, поэтому вам понадобится ссылка на каждый из них. Определим публичные глобальные переменные:
public AudioSource exitAudio;
public AudioSource caughtAudio;
Поскольку игра должна воспроизводить разные аудиоисточники в зависимости от того, был пойман Джон Лимон или сбежал, вам нужно добавить еще один параметр в метод EndLevel. Измените сигнатуру метода EndLevel на следующую:
void EndLevel(CanvasGroup imageCanvasGroup, bool doRestart, AudioSource audioSource)
Исправим вызовы метода EndLevel с учетом изменений - теперь при вызове необходимо указывать звук, который требуется воспроизвести. В первый вызов метода EndLevel добавим звук exitAudio:
EndLevel(exitImageCanvasGroup, false, exitAudio);
Во второй вызов метода EndLevel добавим звук caughtAudio:
EndLevel(caughtImageCanvasGroup, true, caughtAudio);
Скрипт будет выглядеть так:
Когда игра завершилась, метод EndLevel вызывается каждый кадр в Update(), поэтому аудиоисточники будут воспроизводиться каждый кадр. Но нам нужно, чтобы аудиоисточники проигрались всего один раз, поэтому нам понадобится способ остановить их после первого проигрывания. Для этого нам понадобится переменная логического типа. Заведем глобальную переменную:
bool isAudioPlayed;
По умолчанию значение переменной будет false (ложное). При воспроизведении звука мы добавим проверку, является ли переменная ложной. И запустим звук, если условие выполняется. При этом, после запуска звука, установим для переменной новое значение true. После этого условие проверки, является ли переменная ложной, больше никогда не выполнится, и звук не запустится повторно. Условие запуска звука будет выглядеть следующим образом:
if (isAudioPlayed == false)
{
audioSource.Play();
isAudioPlayed= true;
}
Скрипт будет выглядеть так:
Осталось связать публичные переменные с аудиоклипами. Вернитесь в редактор Unity, в окне иерархии выберите объект GameEnding и перетащите мышкой объект Escape в поле ExitAudio, а объект Caught в поле CaughtAudio.
На этом мы закончили работу с недиегетическими звуками. В следующей части добавим звуки конкретным объектам.
Part 18 https://dzen.ru/a/Y85Jo2D9A3EiKIqO