[Перевод] Туториал по Unreal Engine. Часть 7: звук

033326fb3421c16a4a86ef7692ac5048.jpg


В видеоиграх под понятием «звук» подразумеваются музыка, диалоги и звуковые эффекты. В наше время игра без звука будет казаться небрежной и незавершённой.

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

В этой части туториала вы научитесь следующему:

  • Воспроизводить музыку и зацикливать её
  • Воспроизводить звуковой эффект в определённых точках анимации
  • Модулировать тон звука при каждом воспроизведении
  • Перемещать их регулировать громкость звука в зависимости его местоположения в 3D-пространстве
  • Управлять с помощью UI громкостью музыки и звуковых эффектов по отдельности


Учтите, что в этой части мы будем использовать Blueprints. Если вы ещё не читали предыдущие части, то изучите их, потому что в них рассматриваются различные аспекты Blueprints.

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

Примечание: эта статья является одной из восьми частей туториала, посвящённого Unreal Engine:

  • Часть 1: Знакомство с движком
  • Часть 2: Blueprints
  • Часть 3: Материалы
  • Часть 4: UI
  • Часть 5: Как создать простую игру
  • Часть 6: Анимация
  • Часть 7: Звук
  • Часть 8: Системы частиц


Приступаем к работе


Скачайте заготовку проекта и распакуйте её. Откройте проект, перейдя в папку проекта и запустив SkywardMuffin.uproject.

Нажмите на Play, чтобы начать игру. Цель игры — коснуться как можно больше облаков, не упав вниз. Нажмите на левую клавишу мыши, чтобы подпрыгнуть к первому облаку.

GIF
4c1a618e37e46d788851b2ad5ec04802.gif


Игра расслабляет, не так ли? Чтобы усилить чувство расслабления, мы начнём с того, что будем воспроизводить спокойную пианинную музыку.

Воспроизведение музыки


Перейдите в Content Browser и найдите папку Audio. Здесь находятся все звуки, которые будут использоваться в этом туториале. Их можно прослушать, наведя курсор на их значок, а затем нажав на появившийся значок воспроизведения.

f0663d13d8b188b2068f82d272189ee5.jpg


Воспроизвести музыку просто: достаточно перетащить звуковой ассет во Viewport. Однако музыка воспроизведётся только один раз. Зацикленность необходимо включать в ассете вручную. Дважды щёлкните на S_Music, чтобы открыть его.

daa410dfff998831f4f0a00411c3721e.jpg


Откроется новое окно с единственной панелью Details. Перейдите в раздел Sound Wave и включите Looping.

83ee9376d0983f3a38d7fbd71be36d96.jpg


Затем вернитесь в основной редактор и перетащите ассет S_Music во Viewport.

GIF
ee70d5898f15628f5c241605b737291f.gif


При этом будет создан актор AmbientSound с источником звука S_Music. Этот актор будет автоматически воспроизводить S_Music при запуске игры.

Нажмите на Play, чтобы прослушать музыку. Через 17 секунд (длительность музыки) она зациклится и начнётся сначала.

feedb4ad174f3f7d5df80230debcdc73.gif


Теперь нам нужно создать звуковой эффект для шагов маффина. Для этого мы будем использовать Animation Notify.

Что такое Animation Notify?


Animation Notify позволяет разработчику запустить выполнение события в определённой точке анимации. Их можно использовать множеством различных способов. Например, можно создать Notify для спауна эффекта частиц.

GIF
7126e3cd5240e9f8a44bd4e934f76b59.gif


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

GIF
47f6908e5378e46c38f55018c920f717.gif


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

Создание Animation Notify


Перейдите в папку Characters\Muffin и откройте SK_Muffin_Walk. При этом откроется Animation editor.

В панели под Viewport есть область под названием Notifies. Светло-серая область — это Notify Track. Именно здесь мы будем создавать Notify и управлять ими.

4963c0cc03a832cf56ea87be3d2d5a1f.jpg


Ноги маффина касаются земли в кадре 10 и в кадре 22, поэтому нам нужно создать Notify для каждой из этих точек. Для создания Notify нажмите правой клавишей мыши на Notify Track и выберите Add Notify\Play Sound. При этом создастся Notify с названием PlaySound.

01f7454c1764afd3a390c1d0429070be.jpg


Теперь нужно позиционировать Notify, чтобы он происходил в кадре 10.

Перемещение Animation Notify


Немного сложно понять, куда двигать Notify, потому что на Notify Track не показано, где находится кадр 10. Однако можно отобразить с помощью Timeline маркер.

Во-первых, зайдите в Timeline, расположенную в нижней части панели. Перетащите красный указатель воспроизведения и отпустите, когда Current Frame будет равен 10. Сначала необходимо поставить его на паузу!

GIF
4cd0243caff175530f91a94a78359411.gif


Теперь на Notify Track появится красная линия, сообщающая, где находится указатель воспроизведения.

131bcb345d940f77d1a4703b9548f5aa.jpg


Перетащите Notify PlaySound и отпустите его, когда он привяжется к красной линии.

GIF
dc76e98caee6a600233b3201da310c3a.gif


Теперь нам нужно сказать Notify, что надо воспроизвести звук шагов.

Воспроизведение звука шагов


Нажмите левой клавишей мыши на PlaySound, чтобы выбрать его и перейдите в панель Details. В разделе Anim Notify задайте для Sound значение S_Footstep.

58c43244bdb031c49b2076fa96786d4e.jpg


Затем повторите процесс для следующей ноги. Сделайте следующее:

  • Создайте ещё один Notify Play Sound
  • Переместите Notify на кадр 21
  • Выберите для Notify звук S_Footstep


2ade1b498f5cac94f774b3afbe919902.jpg


Теперь, когда анимация ходьбы будет достигать кадра 10 и кадра 21, Notify будет срабатывать и запускать воспроизведение звука S_Footstep.

Закройте SK_Muffin_Walk и вернитесь в основной редактор. Нажмите на Play и начните ходить по земле, чтобы услышать шаги.

GIF
abf1524d9f14a04113f0235c97efff4e.gif


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

В следующем разделе мы будем воспроизводить звуковой эффект, когда игрок касается облака. Но в этот раз мы каждый раз будем вносить вариации в звуки с помощью Sound Cue.

Что такое Sound Cue?


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

Вот пример Sound Cue с использованием Concatenator для последовательного воспроизведения трёх разных звуков:

0a8fcee7d6139ad74a132e7f46d5988d.jpg


Если использовать вместо него нод Random, то вы сможете выбирать случайный звук каждый раз при воспроизведении Sound Cue.

a221a278482e4905e88e73ff526bab6f.jpg


В этом туториале мы создадим и будем использовать Sound Cue для изменения тона звука.

Создание Sound Cue


Сначала вернитесь в папку Audio. Там есть звуковой эффект S_Pop, для которого мы создадим Sound Cue. Чтобы сделать это, нажмите правой клавишей мыши на S_Pop и выберите Create Cue.

e73462420b01b5362e4ac2d5f8f8d3e7.jpg


При этом будет создан новый ассет Sound Cue под названием S_Pop_Cue. Дважды щёлкните на S_Pop_Cue, чтобы открыть его в Sound Cue editor.

d22a2ddd9aa8062e505bf28097736298.jpg

Примечание: этот редактор очень похож на редактор материалов, поэтому я не буду подробно его рассматривать. Если вы незнакомы с редактором материалов, то можете узнать о нём в части Знакомство с движком.

В графе есть два нода: Wave Player: S_Pop и Output. Sound Cue будет воспроизводить всё, что присоединено к ноду Output (в этом случае он воспроизводит звук S_Pop). Прослушать Sound Cue можно, перейдя в Toolbar и нажав на Play Cue.

8d2c38b80d74757a82b16a8df20af75c.jpg


Теперь нам нужно узнать, как изменять тон звука.

Изменение тона звука


Чтобы изменить тон звука, нам нужен нод Modulator. Создайте его и соедините следующим образом:

f36c00d50b1e255017d32e3013bcbe4e.jpg


Теперь необходимо задать величину изменения тона. Выберите нод Modulator и перейдите в панель Details. Там есть два относящихся к тону поля: Pitch Min и Pitch Max. Значения меньше 1 показывают, что тон можно уменьшить, и наоборот. Значение 1 показывает, что тон останется прежним.

В этом туториале мы будем только повышать тон. Задайте Pitch Min значение 1.0, а Pitch Max — значение 2.0.

773a243fb0eb6b2e0a1601c70d94b4e6.jpg


Теперь при каждом воспроизведении Sound Cue звук будет иметь тон в интервале от исходного тона до удвоенного исходного тона.

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

Воспроизведение Sound Cue


Вернитесь к основному редактору и перейдите в папку Blueprints. Откройте BP_Cloud, а затем функцию CloudTouched. Эта функция выполняется тогда, когда игрок касается облака, то есть это идеальное место для воспроизведения Sound Cue.

Здесь есть два нода, которые можно использовать для воспроизведения звука:

  • Play Sound 2D: воспроизводит звук без какого-либо затухания или пространственной локализации (я расскажу о них подробнее ниже). Используйте этот нод для звуков, которые не «существуют» в игровом мире, например, для музыки и звуков UI.
  • Play Sound at Location: воспроизводит звук в точке 3D-пространства. Используйте этот нод, если хотите, чтобы звук менялся в зависимости от местонахождения и направления игрока.


Поскольку облако существует в игровом мире, звук тоже должен существовать в игровом мире. Добавьте в конец цепочки нодов нод Play Sound at Location.

9fdf9b5a580fc791508d86bc1f1757d0.jpg


Затем задайте для Sound значение S_Pop_Cue.

5723097f2fbfc13e671c102c3f949e64.jpg


Теперь когда игрок касается облака, будет воспроизводиться S_Pop_Cue.

Нажмите на Compile и вернитесь в основной редактор. Нажмите на Play и начните играть в игру. При каждом касании облака вы должны слышать одинаковый звук с разным тоном.

GIF
fb8795136cbd13e8b7444d6c48bb9ee1.gif


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

Что такое позиционирование?


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

GIF
d1fb8fdad2aaff16111bc57399ebe747.gif


Кроме того, что позиционирование усиливает ощущения погружения в игру, оно также может помочь геймплею. В соревновательных играх наподобие Overwatch и Counter-Strike, позиционируемый звук помогает игрокам распознавать положение других игроков.

В этом туториале мы воспользуемся позиционированием для перемещения звука облака на основании его местоположения.

Создаём позиционирование


Есть два способа создания позиционирования Sound Cue:

  • Ассет Sound Attenuation: этот ассет содержит настройки, связанные с затуханием и позиционированием. Можно назначать этому ассету различные звуки, чтобы все они имели одинаковые настройки.
  • Override Attenuation: вместо ассета Sound Attenuation можно задавать настройки внутри Sound Cue. Это позволяет создавать настройки для отдельных Sound Cue.


В этом туториале мы воспользуемся вторым способом. Откройте S_Pop_Cue и перейдите в панель Details. Найдите раздел Attenuation и включите Override Attenuation. При этом станет активным раздел Attenuation Overrides.

e92fbdcd59b0719cfb0732bf138f606c.jpg


Чтобы убедиться в том, что позиционирование включено, нажмите на стрелку рядом с Attenuation Overrides. Настройка Spatialize показывает, что позиционирование звука выполняется.

2df7ad2e9ce5c24d6e0ff54724f6b112.jpg


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

Воспроизведение звука в 3D-пространстве


Откройте BP_Cloud и создайте нод GetActorLocation. Теперь соедините его с контактом Location нода Play Sound at Location.

bf9a2825eb22813fa335d4e773d233d3.jpg


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

Нажмите на Compile и вернитесь в основной редактор. Нажмите на Play и начните касаться облаков. Вы должны услышать звуки, которые будут казаться приходящими из разных мест.

GIF
2886d43ba3df4349bbe050dfea4efd44.gif


Примечание: по умолчанию слушателем звука является камера. Это означает, что вы будете слышать звуки с точки местоположения камеры. Если вы хотите заменить слушателя другим актором, то можно использовать нод Set Audio Listener Override.

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

Добавление звука дождя


Вместо использования нода для воспроизведения звука дождя можно применить компонент Audio. Одно из преимуществ использования компонента заключается в том, что он автоматически воспроизводится в точке местоположения облака.

Откройте BP_Cloud и перейдите в панель Components. Добавьте новый компонент Audio и назовите его RainAudio.

Перейдите в панель Details и найдите раздел Sound. Измените значение Sound на S_Rain.

3948538c2071949dc209906a80ec0cf9.jpg


Звук дождя не должен воспроизводиться для обычных облаков. Это значит, что для них RainAudio нужно деактивировать. Для этого прокрутите вниз, к разделу Activation и отключите Auto Activate.

8486b8b86c279be6cee745ff16d5bfde.jpg


Теперь нам нужно активировать RainAudio для дождевых облаков. Удобно это будет делать в функции EnableRain. Эта функция исполняется, если облако должно быть дождевым. Откройте функцию EnableRain и добавьте выделенные ноды:

ea344cf2cf1424f329788ef244416cf7.jpg


Теперь нужно включить затухание и задать настройки затухания.

Настройка затухания


Перейдите в панель Components и выберите RainAudio. Перейдите в панель Details и зайдите в раздел Attenuation. Включите настройку Override Attenuation.

Настройки затухания определяют снижение громкости звука в зависимости от расстояния. В области Attenuation Overrides есть две настройки, которыми мы можем воспользоваться:

  • Radius: максимальное расстояние, на котором может быть игрок, прежде чем громкость начнёт уменьшаться
  • Falloff Distance: расстояние, на котором может быть игрок, прежде чем звук станет неслышным. Это расстояние прибавляется к радиусу.


Посмотрите на пример:

GIF
b5e3fd67f6f4e7f954d8d5bc57f4dff5.gif


Когда игрок находится в пределах внутреннего круга (задаваемого настройкой Radius), громкость равна 100%. Когда игрок двигается из внутреннего круга к краю внешнего круга (задаваемого настройкой Falloff Distance), громкость снижается до 0%.

В этом туториале мы присвоим настройке Radius значение 300, а настройке Falloff Distance — значение 400.

14929a93be985feed09b688c86d7b58a.jpg


Это значит, что громкость звука будет равна 100%, когда игрок находится в пределах 300 единиц от звука. Когда расстояние будет приближаться к 700 (300 + 400) единицам, громкость начнём падать до 0%.

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

Плавное снижение громкости звука


Переключитесь в Event Graph и найдите событие FadeOut. Это можно сделать, перейдя к панели My Blueprint и зайдя в раздел Graphs. Дважды щёлкните на FadeOut в списке EventGraph.

Добавьте в конец цепочки нодов выделенные ноды:

aedc4ce6acc0b0ec5df4276baaf41787.jpg

FadeOut выполняется, когда игрок касается облака. Нод Timeline (FadeTimeline) выводит значение (Alpha), которое за указанное время снижается с 1 до 0. Благодаря этому значению громкость RainAudio будет постепенно снижаться.

Примечание: можно дважды щёлкнуть на нод Timeline, чтобы открыть его и посмотреть, как он работает. Если вы хотите больше узнать о Timelines, то изучите официальную документацию.

Прежде чем услышать это в действии, необходимо изменить одну настройку в S_Rain. Когда громкость звука равна 0%, его воспроизведение останавливается. Поскольку когда звук начинается, когда мы находимся за пределами слышимости, то громкость S_Rain будет равна 0%. Когда мы переместимся в пределы слышимости, то ничего не услышим.

GIF
71b2c8d437b25e9e8a10eb35f9dca3f4.gif


Это можно исправить с помощью настройки Virtualize when Silent. Эта настройка будет всегда воспроизводить звук, вне зависимости от его громкости.

Нажмите на Compile и закройте BP_Cloud. Перейдите в папку Audio и откройте S_Rain. Перейдите в раздел Sound и включите Virtualize when Silent.

b1fadd4c6fdb5b9b2fe1e0bccdb9268c.jpg


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

GIF
d304463769c97f439c96d68a304b1ba7.gif


В последнем разделе мы будем контролировать громкость звуков с помощью Sound Class и Sound Mix.

Sound Class и Sound Mix


Sound Class — это простой способ группировки нескольких звуков. Например, можно сгруппировать всю музыку в один класс, а звуковые эффекты — в другой.

ce4df6d2da6c591de76efc154b3b7d98.jpg


Чтобы изменять свойства Sound Class (громкость, тон и т.д.) во время игрового процесса, нам нужно использовать Sound Mix. Sound — это таблица, каждая запись которой являтеся Sound Class. Каждая запись содержит настройки, которые должны быть у Sound Class.

Вот пример того, что может содержаться в Sound Mix:

1e24f552421243bc1a85a69d8e06a1ac.jpg


При использовании показанного выше Sound Mix все звуки в классе Music будут проигрываться с половинной громкостью. У всех звуков в классе Effects будет удвоен тон.

Во-первых, мы создадим классы звука (Sound Class).

Создание классов звука


В этом туториале мы будем отдельно регулировать громкость музыки и эффектов. Это значит, что нам понадобятся два Sound Class. В Content Browser нажмите на Add New и выберите Sounds\Sound Class. Переименуйте Sound Class в S_Music_Class.

Создайте ещё один Sound Class и назовите его S_Effects_Class.

00114ff1d01cec28c55378c9e91a1066.jpg


Теперь нужно привязать каждый звук к Sound Class. Для начала мы сделаем это с музыкой. Откройте S_Music и найдите раздел Sound. Измените Sound Class на S_Music_Class.

2dfb34c9653632711730701246444a93.jpg


Сделав это, закройте S_Music.

Следующими будут звуковые эффекты. Вместо того, чтобы открывать каждый звук по отдельности и привязывать его к Sound Class, мы можем сделать это одновременно. Сначала выберите следующие ассеты:

  • S_Footstep
  • S_Pop_Cue
  • S_Rain


Затем нажмите правой клавишей мыши на одном из выбранных ассетов. Выберите Asset Actions\Bulk Edit via Property Matrix. При этом ассеты откроются в редакторе матрицы свойств.

03f2567daa0ae36e5c7e719c2f3d67d6.jpg


Редактор матрицы свойств позволяет изменять общие свойства за один раз.

Перейдите в панель Details и разверните ветку Sound. Для выбора Sound Class нажмите на значок сетки справа от Sound Class.

9f16688754226bcdc9e9159d8ec1b004.jpg


Выберите S_Effects_Class, а затем закройте редактор матрицы свойств.

Все звуки теперь находятся в соответствующем Sound Class. Далее мы создадим Sound Mix и настроим его с помощью Blueprints.

Создание и настройка Sound Mix


В Content Browser нажмите на Add New и выберите Sounds\Sound Mix. Переименуйте Sound Mix в S_Volume_Mix.

Чтобы управлять громкостью каждого Sound Class, мы будем использовать ползунки. Я уже создал виджет с двумя ползунками, чтобы вы могли его использовать. Перейдите в папку UI и откройте WBP_Options.

be841e247649d343f914611a82e5fc27.jpg


Чтобы настроить громкость, нам нужно использовать значение этих ползунков и передавать их в Sound Mix. Сначала мы сделаем это для музыки.

Переключитесь в режим Graph и перейдите в панель My Blueprints. В разделе Variables выберите MusicSlider. Перейдите в панель Details и нажмите на кнопку рядом с On Value Changed.

70f204785ca20fda084ca524b82ab40f.jpg


При этом будет создано событие On Value Changed (MusicSlider). Это событие срабатывает, когда мы будем перемещать ползунок.

e966e0b87a414863c5806d462082958d.jpg


Теперь нам нужно задать громкость S_Music_Class в S_Volume_Mix. Для этого нам нужно использовать нод Set Sound Mix Class Override. Этот нод позволяет указать Sound Mix и Sound Class. Если Sound Class не находится в Sound Mix, то он будет добавлен. Если он уже есть в Sound Mix, то он будет обновлён.

Добавьте нод Set Sound Mix Class Override и выберите следующие опции:

  • In Sound Mix Modifier: S_Volume_Mix
  • In Sound Class: S_Music_Class
  • Fade in Time: 0 (благодаря этому регулировка громкости будет выполняться мгновенно)


df10ce0923b0f9a3c1368b53816505ae.jpg


Затем соедините ноды следующим образом:

4be87a50eba768514b9deef2209d1b25.jpg


Повторите эти шаги для EffectsSlider. Замените контакт In Sound Class на S_Effects_Class.

4265796940da11f2673fafec460cf336.jpg


Теперь при изменении значения ползунка S_Volume_Mix будет регулировать громкость соответствующего Sound Class.

Чтобы это заработало, нам нужно активировать Sound Mix.

Активация Sound Mix


В подобных случаях (когда громкость регулируется через UI) лучше активировать Sound Mix при запуске игры. Таким образом, Sound Class будет автоматически использовать регулировку громкости из Sound Mix. Однако ради простоты мы будем активировать Sound Mix внутри виджета.

Создайте нод Event Pre Construct. Он подобен ноду Event BeginPlay, используемому в Blueprints.

1453e3f0ef4cdbfdb2d42275d5b18263.jpg


Чтобы активировать Sound Mix, нам нужно использовать нод Push Sound Mix Modifier. Создайте его и соедините с Event Pre Construct. Затем задайте In Sound Mix Modifier значение S_Volume_Mix.

81470a9334f0210e3adbc80e8f0b11fe.jpg


Благодаря этому S_Volume_Mix будет активироваться при спауне WBP_Options.

Нажмите на Compile и закройте WBP_Options. Нажмите на Play и нажмите клавишу M, чтобы открыть ползунки. Двигайте ползунки, чтобы изменять громкость каждого Sound Class.

Заголовок спойлера
700b90a8b16b136feaf9898cf337347d.gif


Куда двигаться дальше?


Скачать готовый проект можно здесь.

Как вы видите, работать со звуком в Unreal Engine 4 довольно просто. Если вы хотите узнать больше о системе звука, то изучите официальную документацию. Можно создавать другие интересные эффекты, добавляя реверберацию и эквалайзер. Кроме того, познакомьтесь с возможностями, которые появятся после выпуска нового звукового движка!

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

© Habrahabr.ru