Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Unity_в_действии_Джозеф_Хокинг_Рус.pdf
Скачиваний:
83
Добавлен:
21.06.2022
Размер:
26.33 Mб
Скачать

246      Глава 10. Звуковые эффекты и музыка

поэтому для нее выбирайте вариант Vorbis (это название аудиоформата со сжатием). Короткие звуковые клипы в сжатии не нуждаются, поэтому выбирайте для них вариант PCM (Pulse Code Modulation — импульсно-кодовая модуляция). Третий вариант — ADPCM — является вариацией PCM и дает несколько более качественный звук.

Раскрывающийся список Load Type позволяет указать, каким образом компьютер будет загружать данные из файла. Так как объем памяти у компьютера ограничен, а аудиофайлы могут быть очень большими, иногда имеет смысл запустить воспроизведение звука в процессе его передачи в память, избавляя компьютер от необходимости единовременно загружать весь файл. Однако такая передача звука требует затрат вычислительных ресурсов, поэтому быстрее всего воспроизводятся файлы, предварительно загруженные в память. Но даже в этом случае вы можете выбрать, будут ли данные представлены в сжатой форме или их следует распаковать для более быстрого воспроизведения. Так как наши аудиоклипы имеют небольшой размер, воспроизведение в процессе загрузки нам не требуется, поэтому можно выбрать вариант

Decompress On Load.

Итак, в нашем проекте появились импортированные и готовые к использованию аудиофайлы­.

10.2. Воспроизведение звуковых эффектов

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

10.2.1. Система воспроизведения: клипы, источник, подписчик

Возможно, вы ожидаете, что для проигрывания звука в Unity достаточно указать, какие клипы нужно воспроизводить, но на самом деле для этого нужно задать три компонента: AudioClip, AudioSource и AudioListener. Подобное разделение связано с поддержкой в Unity трехмерного звука: различные компоненты сообщают Unity информацию о местоположении, которая используется для управления трехмерным звуком.

2D- И 3D-ЗВУК

Звук в играх делится на двухмерный и трехмерный. С первым вы уже знакомы, это стандартный звук, воспроизводимый обычным образом. Выражение «2D-звук» в большинстве случаев означает

«не 3D-звук».

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

ВUnity поддерживаются оба вида звуков, и вы сами выбираете вид звука для каждого источника. Звук для таких вещей, как музыка, должен быть двухмерным, в то время как трехмерный звук в большинстве звуковых эффектов создает ощущение присутствия в сцене.

Вкачестве аналогии представьте магнитолу, проигрывающую компакт-диск в комна-

те. Зашедший в комнату человек четко услышит звук. Уходя из комнаты, он начнет

10.2. Воспроизведение звуковых эффектов      247

слышать его все тише, и в конце концов звук вообще исчезнет. При перемещении магнитолы по комнате вы будете слышать, как меняется громкость звука. Эту аналогию иллюстрирует рис. 10.2. Компакт-диск — это аналог компонента AudioClip, магнитола — компонента AudioSource, а человек — компонента AudioListener.

AudioListener

AudioClip

AudioSource

Рис. 10.2. Схема компонентов, управляющих аудиосистемой в Unity

Первым компонентом является аудиоклип. Он связан с реальным звуковым файлом, который мы импортировали в предыдущем разделе. Эти необработанные данные о форме сигнала являются основой всего, что делает аудиосистема, но сам по себе аудиоклип не выполняет никаких действий.

Следующий вид объекта — это источник звука. Именно он воспроизводит аудиоклипы. Это абстракция того, что на самом деле делает аудиосистема, но именно она делает более понятной концепцию трехмерного звука. 3D-звук, воспроизводимый конкретным источником, расположен в той же самой точке, что и этот источник; и хотя 2D-звуки также воспроизводятся источником, их местоположение не имеет значения.

Третьим видом объекта в составе аудиосистемы в Unity является слушатель звука. Как понятно из его названия, это объект, который слышит звуки, проецируемые из источников. Это еще одна абстракция реальных операций аудиосистемы (ведь очевидно, что реальным слушателем является играющий в игру человек!), но аналогично тому, как положение источника звука определяет координаты места, из которого исходит звук, положение слушателя звука определяет координаты места, в котором слышен звук.

УСОВЕРШЕНСТВОВАННАЯ СИСТЕМА УПРАВЛЕНИЯ ЗВУКОМ

В Unity 5 появилась функция Audio Mixers (аудиомикшеры). Аудиомикшеры позволяют обрабатывать аудиосигналы и накладывать на клипы различные эффекты. Более подробно сэтой функцией мож-

но познакомиться вдокументации к Unity: http://docs.unity3d.com/ru/current/Manual/AudioMixer.html.

Такие компоненты, как AudioClip и AudioSource, нужно назначать, а вот компонентом AudioListener оснащена камера, которая по умолчанию появляется в каждой новой сцене. Как правило, вам нужно, чтобы 3D-звуки реагировали на положение наблюдателя.

248      Глава 10. Звуковые эффекты и музыка

10.2.2. Присваивание зацикленного звука

Итак, давайте настроим наш первый звук в Unity! Аудиоклипы уже импортированы, у используемой по умолчанию камеры есть компонент AudioListener, так что нам остается назначить только компонент AudioSource. Добавим треск огня к шаблону Enemy — это персонаж, который хаотично перемещается по сцене.

ПРИМЕЧАНИЕ  Так как враг будет звучать так, как будто он охвачен пламенем, можно связать с ним систему частиц, чтобы придать ему соответствующий звуку вид. Можно скопировать систему частиц, созданную в главе 4, превратив объект Particle в шаблон экземпляра, а затем выбрав в меню Asset команду Export Package. В качестве альтернативы можно повторить процедуру из главы 4, создав новый объект с нуля (перетащите шаблон Enemy в сцену для редактирования, а затем выберите в меню GameObject команду Apply Changes To Prefab).

Обычно для редактирования шаблона экземпляра его нужно перетащить в сцену, но в данном случае эту процедуру можно выполнить напрямую сразу же после добавления компонента к объекту. Выделите шаблон Enemy, чтобы его свойства появились на панели Inspector. Затем добавьте новый компонент, выбрав вариант Audio Audio Source. На панели Inspector появится компонент AudioSource.

Укажите источнику аудиоклип, который нужно воспроизвести. Перетащите файл со звуком со вкладки Project на ячейку Audio Clip панели Inspector; для этого примера мы используем звуковой эффект fireplace (рис. 10.3).

А ,

П Spatial Blend

а•а • а

2D 3D

Д ‚

а ‚ а•а а ƒ?

Н ‚ аƒ

?

Рис. 10.3. Настройки компонента AudioSource

Установите флажки Play On Awake и Loop (обязательно убедитесь, что флажок Mute сброшен). Флажок Play On Awake заставляет источник звука начать воспроизведение сразу же после загрузки сцены (в следующем разделе вы узнаете, как активировать звуки вручную во время игры). Флажок Loop заставляет источник звука играть непрерывно, повторяя клип снова и снова.

Мы хотим, чтобы этот источник аудио испускал 3D-звуки. Как уже объяснялось, 3D-звук имеет в сцене определенное положение. Это свойство источника звука регулируется ползунком Spatial Blend. Именно он отвечает за превращение звука из двухмерного в трехмерный; установите его в крайнее правое положение.

}
...
… вызываем метод PlayOneShot() для воспроизведения звука Hit An Enemy или…
Ссылки на два звуковых файла, которые нужно воспроизвести.

10.2. Воспроизведение звуковых эффектов      249

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

10.2.3. Активация звуковых эффектов из кода

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

Добавьте компонент AudioSource к объекту player (а не к камере). Связывать с компонентом конкретный аудиоклип на этот раз нет нужды, так как он определяется в коде. Сбросьте флажок Play On Awake, ведь звук будет возникать в ответ на команду. Ползунок Spatial Blend установите в положение 3D, так как эффект привязан к положению в сцене.

Затем добавьте код из следующего листинга в сценарий RayShooter, отвечающий за стрельбу.

Листинг 10.1. Звуковые эффекты, добавленные в сценарий RayShooter

...

[SerializeField] private AudioSource soundSource; │

[SerializeField] private AudioClip hitWallSound; [SerializeField] private AudioClip hitEnemySound;

...

if (target != null) { ¬ Если переменная target не равна null, значит, игрок выстрелил во врага, поэтому… target.ReactToHit();

soundSource.PlayOneShot(hitEnemySound); ¬ } else {

StartCoroutine(SphereIndicator(hit.point)); soundSource.PlayOneShot(hitWallSound); ¬ ...метод PlayOneShot() для воспроизведения

звука Hit A Wall, если игрок промазал.

В новом варианте кода в верхней части сценария появилось несколько сериализованных переменных. Выделите камеру и перетащите объект player (обладающий компонентом AudioSource) на ячейку soundSource панели Inspector. Затем перетащите на ячейки Hit Wall Sound и Hit Enemy Sound аудиоклипы, которые будут воспроизводиться в каждом случае (swish при попадании в стену и ding при поражении врага).

Остальные две добавленные строки представляют собой методы PlayOneShot(). Именно они заставляют источник звука воспроизвести указанный клип. Методы добавляются в условную инструкцию для переменной target и воспроизводят разные звуки при попадании в разные цели.

ПРИМЕЧАНИЕ  Можно было задать клип в компоненте AudioSource и вызвать для его воспроизведения метод Play(). Но несколько звуков будут обрывать друг друга, поэтому мы воспользовались методом PlayOneShot(). Чтобы понять суть проблемы, замените метод PlayOneShot() вот таким кодом и сделайте несколько быстрых выстрелов:

soundSource.clip=hitEnemySound; soundSource.Play();