Работа с аудио в Unity - трассировка и облачные вычисления

Всем привет! Меня зовут Илья, я из команды TinyPlay. Мы разрабатываем хоррор от первого лица для ПК и XBox Series. Сейчас мы участвуем в конкурсе IndieCup S'21, где вошли в финал в категории Best Audio. В этой статье хотел бы поделиться тем, как мы работаем с аудио. Надеюсь, для вас эта статья будет полезной.

Работа с аудио в Unity - трассировка и облачные вычисления

Архитектура аудио

Проект состоит из 3-х составляющих: звуки (шаги, атмосфера, противники, оружие и многое многое другое), музыка (атмосферная, экшн-музыка, дополнительное сопровождение) и озвучка (персонажи, аудио-дневники, громокоговорители). Архитектура аудио разделена следующим образом:

Работа с аудио в Unity - трассировка и облачные вычисления

Звуки:

- Окружающая среда и все что с ней связано (листва, ветер, скрипы деревьев, ворот и пр.);

- Звуки противников (атака, получение урона, обнаружение, смерть);

- Звуки шагов для каждой из поверхностей (в общей сложности более 200 звуков под разные физические материалы);

- Хоррор-звуки (вызываемые по триггерам);

- Оружие (стрельба, перезарядка и пр.);

- Звуки коллизий для физических объектов;

- Звуки эффектов (взрывы, попадания, искры и пр.);

- Другие звуки;

Музыка:

- Атмосферная фоновая музыка;

- Экшн музыка для определенных сцен;

- Напряженная музыка;

- Музыка в меню;

Озвучка:

- Озвучка героев на разных языках;

- Озвучка аудио-дневников;

- Озвучка коммутаторов и другая озвучка;

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

Работа с музыкой и звуками. Микширование

Для достижения плавных переходов, различных звуковых областей и работе с компрессией - мы используем стандартный микшер Unity. Для плавных переходов - DOTween.

Пример того, как плавно переходит музыка в игре:

isSwitchingMusic = true; MasterMixer.DOSetFloat("MainMusic", -80f, 2f); MasterMixer.DOSetFloat("SecondMusic", 0f, 2f);

Микшеры также переключаются через особые Volume-зоны, которые меняют активный микшер или его настройки под окружающую среду (к примеру, чтобы в подвале был эффект эхо).

Пример работы с обнаружением материала террэйна:

namespace TinyPlay.Components { using UnityEngine; public class TerrainDetector { private TerrainData terrainData; private int alphamapWidth; private int alphamapHeight; private float[,,] splatmapData; private int numTextures; public TerrainDetector() { terrainData = Terrain.activeTerrain.terrainData; alphamapWidth = terrainData.alphamapWidth; alphamapHeight = terrainData.alphamapHeight; splatmapData = terrainData.GetAlphamaps(0, 0, alphamapWidth, alphamapHeight); numTextures = splatmapData.Length / (alphamapWidth * alphamapHeight); } private Vector3 ConvertToSplatMapCoordinate(Vector3 worldPosition) { Vector3 splatPosition = new Vector3(); Terrain ter = Terrain.activeTerrain; Vector3 terPosition = ter.transform.position; splatPosition.x = ((worldPosition.x - terPosition.x) / ter.terrainData.size.x) * ter.terrainData.alphamapWidth; splatPosition.z = ((worldPosition.z - terPosition.z) / ter.terrainData.size.z) * ter.terrainData.alphamapHeight; return splatPosition; } public int GetActiveTerrainTextureIdx(Vector3 position) { Vector3 terrainCord = ConvertToSplatMapCoordinate(position); int activeTerrainIndex = 0; float largestOpacity = 0f; for (int i = 0; i < numTextures; i++) { if (largestOpacity < splatmapData[(int)terrainCord.z, (int)terrainCord.x, i]) { activeTerrainIndex = i; largestOpacity = splatmapData[(int)terrainCord.z, (int)terrainCord.x, i]; } } return activeTerrainIndex; } } }

У нас используется плеер на основе эвентов анимаций, но вы сделать по-другому. Выше описан класс для определения материала террайна. Используя его - можно сопоставить поверхность со звуками.

Объемный звук. Рейтрейсинг и обнаружение геометрии.

Мы перебрали несколько вариантов работы с объемным и главное физически-обоснованым звуком. Мы попробовали Steam Audio, FMOD, Microsoft Acoustics и др.

В итоге наш выбор пал на FMOD + Dolby Atmos + Microsoft Acousitcs. Почему не Steam Audio? Ну, мы получали непредвиденные вылеты в билдах на Windows со стороны их библиотеки, которые не могли отладить.

Для чего мы все это используем?

1) Для автоматического просчета распространения звука в окружающей среде, с учетом её геометрии, материалов и отражаемой способности (каждый объект в игре настраивается отдельно);

2) Для пространственной обработки аудио при помощи HRTF. В связке с Dolby Atmos звук получается максимально естественным.

Как это работает?

Работа с аудио в Unity - трассировка и облачные вычисления

Система учитывает пространственное положение звука, источник его приема, угол и десятки других параметров для корректного восприятия, как в наушниках, так и на 5.1 системах.

Помимо этого, система при помощи рейтрейсинга (трассировки лучей в реальном времени) пробрасывает лучи для определения коллизий и отражений, применимых к звуковым волнам. Для снижения нагрузки эти расчеты производятся на GPU + звук запекается (аналогично Light Probes, но для звука).

Облачные вычисления для запекания звука

Запекать звук на сцене с тысячами 3D моделей и миллионами полигонов достаточно долго, поэтому мы используем облачные вычисления от Azure. Благо у Microsoft есть отличный инструмент на виртуальных машинах, предназначенный для этого - Azure Batch

Работа с аудио в Unity - трассировка и облачные вычисления

Используя сервис облачных вычислений удается снизить время запекания звука с 2 часов до 10 минут, что существенно экономит время при достаточно низкой цене (1,5 бакса в час). При этом есть бесплатная подписка на Azure на 12,500Р, что подходит начинающим разработчикам.

Итого

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

Посмотреть пример того, как все работает вкупе можно здесь (на озвучку главного героя не обращайте внимания, мы её уже заменили, но пока не публиковали):

Полезные ссылки:

Наша группа игры:

Кому интересно, то есть статья о нашем участии в IndieCup S'21:

Буду рад ответить на ваши вопросы и пообщаться на тему реализации аудио в играх. Также буду рад вашей поддержке.

2424
6 комментариев

Круто и спасибо, что делитесь опытом!
Вопрос: почему
FMODа не Wwise? Вообще, пробовали второй или сразу с FMOD'ом как всё завелось - так и не стали париться? Мб сейчас в сообществе юнитеков советуют конкретно FMOD (не слежу, но сам вопрос интересен)?

4
Ответить

Вопрос удобства. Для нас удобнее FMOD. И насколько я помню, wwsie ограничен 500 звуками в базовой лицензии, в отличии от fmod, но могу ошибаться.

Ответить

Отлично, обожаю статьи о звуке. Хорошй материал и без воды. Вот только про запекание звука в игрострое впервые слышу, пойду посмотрю, что за монстр.

1
Ответить

Тоже впервые слышу. Пойду смотреть

1
Ответить

«Запекания звука» интересная идея, но не уверен, что работает с динамикой (например, дверь открылась), хотя можно и дописать реализацию.
иногда можно проще сделать, по триггеру переключать настройки fmod, разница может быть несильная

Ответить

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

Ответить