Вы находитесь на странице: 1из 3

[[1.

Введение]]

Существуют игры, в особенности жанра ритм, геймплей которых подразумевает работу со


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

Вот примеры игр, которые анализируют аудио данные в режиме реального времени и
изменяют геймплей в зависимости от того, как сильно меняется звук с течением
времени. Одни из самых популярных игр такого жанра, это Beat Saber в стиме и Tiles
Hop на андроиде. Если быть точнее, во многих подобных играх расчет звука
производится предварительно, но принцип действия будет таким же, как то, о чем
будет рассказываться дальше.
[тут можно показать видео геймплея каких-нибудь из этих игр]
https://play.google.com/store/apps/details?id=com.amanotes.beathopper
https://play.google.com/store/apps/details?id=com.amanotes.pamarollingtiles2
https://play.google.com/store/apps/details?id=com.dropthebeat.beatblade
https://store.steampowered.com/app/620980/Beat_Saber/?snr=1_5_9__300_1
https://store.steampowered.com/app/235800/Audiosurf_2/
https://store.steampowered.com/app/977950/A_Dance_of_Fire_and_Ice/

[[2. Runtime Audio Importer]]

Очень часто в подобных играх используется загрузка аудиофайлов двумя способами:

1) Из памяти устройства. Когда игрок вручную выбирает аудиофайл, который заранее


скачан вручную, например, из интернета.
2) Путем передачи аудиофайлов с сервера по сети игроку, используя, например, HTTP
запросы.

Бесплатный плагин Runtime Audio Importer позволяет импортировать аудиофайлы


форматов MP3, WAV и FLAC из памяти и использовать их в качестве SoundWave (который
используется для любых звуковых дорожек в игре в качестве базового объекта звука).
Если говорить с технической стороны, то плагин работает следующим образом. Он
преобразует байтовые данные аудиофайла в 32-битные PCM данные [interleaved 32-bit
IEEE floating point PCM], которые при воспроизведении звуковой дорожки поочередно
разделяются на фреймы и подаются в аудио поток движка.

[Как пользоваться плагином Runtime Audio Importer. Тут можно показать ноды, как они
работают и т.п.]
Для начала нужно создать объект для импортирования аудиофайлов используя функцию
"Create Runtime Audio Importer". После чего можно привязаться к делегатам
"OnProgress", который можно использовать для отслеживания процесса импортирования,
и "OnResult", который вызывается, когда звуковая дорожка была импортирована. Далее
нужно вызвать функцию "Import Audio From File", где указать путь к аудиофайлу для
импортирования. После чего нужно удостовериться, что звуковая дорожка была успешно
импортирована, используя "Switch" у параметра "Status" в делегате "OnResult",
который должен быть "Success Importing" в успешном случае. После чего можно
воспроизвести звуковую дорожку любым удобным способом. Например через
аудиокомпонент или сразу, через "Play Sound 2D" [в видео можно использовать Play
Sound 2D для простоты]. Очень важно, чтобы в функции для воспроизведения звуковой
дорожки, параметр "Start Time" был равен "0", иначе звуковая дорожка не
воспроизведется. Для перемотки звуковой дорожки в определенный промежуток времени
нужно использовать функцию "Rewind Playback Time". Для того, чтобы узнать, что
звуковая дорожка была полностью воспроизведена, можно привязаться к делегату
"OnAudioPlaybackFinished".
[Касательно предварительного импортирования файлов формата MP3 в редактор, можно
посмотреть эту статью, там некоторые вещи расписаны более подробно -
https://unreal.blog/pre-importing-audio-files]
Так же можно использовать этот плагин для импортирования файлов формата MP3
заранее, в редактор. Он более сжат по сравнению с WAV или OGG, который используется
движком по умолчанию во время импортирования аудиофайлов в редактор. Так же формат
MP3 по сравнению с WAV, который сжимается движком при запаковке проекта, имеет
намного лучшее качество звука.
Для того, чтобы импортировать аудиофайл формата MP3 в редактор, нужно просто
отключить все media player плагины (например Android Media Player) [Эти плагины
можно легко найти по ключевым словам "media player" в графе "Plugins"] и после
обычным drag&drop'ом перенести аудиофайл формата MP3 в редактор. Чтобы
удостовериться, что все импортировалось нормально, достаточно открыть
импортированный ассет и посмотреть указанные параметры, например "Sound duration"
отвечает за продолжительность звука. После чего в блупринтах достаточно создать
"Create Runtime Audio Importer" и вызвать ноду "Import Audio From Preimported
Sound", где выбрать импортированный ассет. Все дальнейшие действия аналогичны тому,
как работает импортирования аудиофайлов в режиме реального времени.

[[3. Runtime Files Downloader]]

Предположим, вы хотите уменьшить вес игры и использовать аудиофайлы, которые


расположены на сервере, а не паковать звуковую дорожку вместе с проектом. В этом
случае вам может помочь плагин Runtime Files Downloader.
Плагин позволит скачивать файлы с сайта по прямой ссылке, в данном случае,
аудиофайлы в какую-нибудь временную папку, а после чего использовать их в игре в
качестве звуковой дорожки.

[Как пользоваться плагином Runtime Files Downloader. Тут можно показать ноды, как
они работают и т.п.]
Для начала нужно создать объект для скачивания файлов используя функцию "Create
Downloader". После чего можно привязаться к делегатам "OnProgress", который можно
использовать для отслеживания процесса скачивания. Для этого можно разделить "Bytes
Received" на "Content Length" и получить процент загрузки [Bytes Received и Content
Length нужно перевести по float, а только после делить]. Так же можно привязаться к
"OnResult", который вызывается, когда файл был скачен. Для начала скачивания файла
нужно использовать функцию "Download File", где указать прямую ссылку на файл для
скачивания и путь, куда сохранять скаченный файл. Далее нужно проверить в делегате
"OnResult", был ли файл успешно скачан, используя "Switch" у параметра "Result".

[[4. Процедурный анализ звука]]

Представим ситуацию, когда требуется создать геймплей, где различные игровые


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

Можно использовать звуковую дорожку SoundWave вместе с аудиокомпонентом SoundCue, в


котором создать "Wave Param", подключенным к "Output". Внутри "Wave Param" нужно
придумать "Wave Param Name".
После импортирования аудиофайла, нужно заполнить "Wave Param" импортированной
звуковой дорожкой с указанным "Wave Param Name", после чего привязаться к делегату
"OnAudioSingleEnvelopeValue", который будет вызываться по мере воспроизведения
звуковой дорожки. Он выдает параметр "Envelope Value", значение которого изменяется
когда амплитуда звуковой дорожки увеличивается или уменьшается на определенное
значение. Таким образом можно определить, произошло ли в определенный промежуток
времени бит или любые другие события, связанные с изменением звука, и менять что-
либо в игре в зависимости от этого. Для примера будем менять скейл сферы [тут можно
добавить функцию Set Actor Scale 3D, куда установить параметр "Envelope Value"]

[Я в будущем планирую сделать бесплатный open source плагин для продвинутого


анализа звука, а именно предварительного определения бита, определения амплитуды /
частотный спектр в определенный промежуток времени и прочее, что связано с
процедурным анализом, можно наверное тоже об этом сообщить по возможности]

Вам также может понравиться