Возможности Unreal Engine 5 для работы со звуком подойдут для самых разных проектов. Импортировать звуковой файл можно, перейдя в папку с содержимым с помощью кнопки Импорт или из папки проводника вашей операционной системы. После этого движок создаст файл .uasset с добавленным звуком. Unreal Engine поддерживает форматы файлов .wav, .ogg, .flac, .aif, .opus, .mp3. Файлы могут иметь битовую глубину 16 или 24 бита и любую частоту дискретизации. Внутри Unreal Engine импортированные аудиофайлы хранятся в 16-битном несжатом формате .wav.
Более подробную информацию о звуковом движке в Unreal можно найти в следующих разделах документации:
Звуковые схемы — это объекты, используемые для воспроизведения звуков в среде выполнения. Звуковые схемы выполняют выбор из набора аудиофайлов, представляющих единую концепцию. К примеру, у вас может быть звуковая схема «Ветер», и в среде выполнения звуковая схема будет выбирать звуки ветра из нескольких аудиофайлов и воспроизводить их. В игре в качестве примера можно взять звуковую схему брызг воды: Содержимое/Sound/SFX/WaterSplash/CUE_WaterSplashSound.
Классы звуков — это типы ресурсов звукового движка, которые позволяют группировать несколько звуков и одновременно изменять параметры всех связанных звуковых волн. В игре Parrot есть класс MainSoundClass, который объединяет музыку и звуковые эффекты.
Миксы классов звуков могут применять ограничения громкости, которые автоматически применяются при воспроизведении любого звука, входящего в этот класс.
Реализация для игры Parrot
В игре Parrot чаще всего используются звуковые схемы, состоящие из одного звука. Громкость и тон настраиваются для каждой схемы отдельно, а общая громкость регулируется стандартным классом звука и звуковыми миксами. Чтобы упростить работу с музыкой, в игре Parrot имеется специальная звуковая подсистема.
Пример: подбираемый предмет
Для подбираемых предметов используются простые звуковые схемы, которые воспроизводятся один раз и затем уничтожаются. В качестве звуковых эффектов применяются звуки монеток с сайта opengameart.org. Импортированные исходные ресурсы находятся по пути Содержимое/Assets/OpenGameArt/8bitCoinSounds. Созданные на их основе звуковые схемы — в Содержимое/Sound/SFX/Pickups. При срабатывании события подбора предмета в BP_PickupBase вызывайте узел Воспроизведение звука: 2D (Play Sound 2D) с нужной звуковой схемой.
Все подбираемые предметы поддерживают визуальные и звуковые эффекты, а также должны уничтожаться при контакте. Сделать это можно в классе BP_PickupBase.
Здесь можно использовать «Воспроизведение звука: 2D», поскольку вам не требуется, чтобы звук был пространственно привязан к миру. Если требуется определённое позиционирование звука в пространстве, вместо этого можно использовать узел «Воспроизвести звук в локации» (Play Sound at Location).
Циклы музыки
Музыка здесь работает так же, как и стандартные звуковые схемы. Импорт звуковых файлов и настройка звуковых схем будут практически такими же, как и для звуковых эффектов. Есть лишь несколько дополнительных шагов.
На самом импортированном ресурсе звука проверьте, чтобы режим виртуализации был установлен на Воспроизведить с выключенной громкостью (Play When Silent). Это важно, так как позволяет проигрывателю применять допустимые настройки громкости. Без этого при отключении громкости звук будет уничтожен и больше не будет воспроизводиться при её восстановлении.
В самой звуковой схеме нажмите на узел дорожки и проверьте, чтобы был установлен параметр С зацикливанием (Looping).
Настройки звука
Все настройки в игре Parrot связаны с различной громкостью звука.
По пути Содержимое/Sound/Settings вы найдёте ресурс класса звука под названием MainSoundClass. В разделе Дочерние классы (Child Classes) для класса звука вы можете задать любые другие классы звуков. Среди дочерних классов по умолчанию будут звуковые эффекты и музыка.
В этой же папке вы найдёте ресурс DefaultSoundMix. Вы можете задать Эффекты звукового класса (Sound Class Effects) в настройках MainSoundClass. Обязательно проверьте, чтобы был включён параметр Применить к дочерним компонентам (Apply To Children).
Убедитесь, что в каждой звуковой схеме для класса назначена соответсвующая категория. К примеру, для подбираемых предметов используйте класс SFX.
Чтобы изменить настройки микса в среде выполнения, можно использовать узлы Задать переопределение микса класса звука (Set Sound Class Mix Override) и Вставить модификатор звукового микса (Push Sound Mix Modifier). Это позволит применить все внесённые изменения.
Здесь приведён пример с использованием схем Blueprint, однако в игре Parrot это реализовано на C++ в звуковой подсистеме.
Звуковая подсистема в игре Parrot
В этом разделе мы разберём реализацию звуковой подсистемы. Чтобы узнать, почему в игре Parrot используется подсистема для звука, см. раздел Подсистемы в игре Parrot.
Подсистема звука в игре Parrot — это класс C++ под названием UParrotAudioSubsystem. Он имеет то же время жизни, что и экземпляр игры, поскольку настройки громкости можно изменить в любой момент из главного меню или через меню паузы. Непосредственно во время прохождения уровней игры подсистема звука также прослушивает изменения состояния игры. Таким образом, вы можете менять музыкальную дорожку в начале уровня, когда уровень завершён или когда игрок выходит за пределы границ.
WBP_SettingScreen демонстрирует подсистему звука в действии. Значения ползунков из UMG (конструктор интерфейсов в Unreal Motion Graphics) передаются в подсистему на C++. Микшер звука в среде выполнения обновляется при изменении значений. Время появления будет равно нулю для того, чтобы изменения громкости применялись моментально.
Настройки сохраняются в узле Сохранить настройки звука.
Более подробно о том, как работает сериализация для сохранения настроек, рассказано в разделе «Сериализация в игре Parrot».
Музыка в игре Parrot почти полностью реализована на C++. Из-за структуры игры Parrot, где каждая карта — это отдельный уровень, существует класс AParrotWorldSettings. С его помощью можно задать любые данные мира, например музыку на уровне. Подсистема звука запрашивает настройки мира и извлекает нужный трек. Чтобы реагировать на изменения состояния после начала игры, необходимо выполнить привязку к состоянию игры в WorldBeginPlay.