Найти тему
Тихий Уголок

FMOD интеграция на мобильную игровую платформу

Оглавление

перевод статьи Jakub Kopriva - FMOD integration to a mobile gaming platform

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

TLDR:

Если вы знаете, что такое FMOD и FMOD Studio, можете пропустить вводный раздел.
Я укажу на проблемы, с которыми мы имели дело, и примеры фрагментов кода, чтобы дать вам представление о том, как мы их решили. Это не какая-то мантра, которой вы должны придерживаться, я просто описываю, как мы продвигались и как мы в конечном итоге достигли наших целей и потребностей.

***

Описание

  • Раздел 1 - Введение в FMOD и адаптивную музыку
  • Раздел 2 - Music Manager, связывающий интеграцию FMOD с нашей игрой
  • Раздел 3 - UX и музыка в мобильных играх
  • Раздел 4 - Плагин iOS и Android для управления встроенным музыкальным проигрывателем в ОС
  • Раздел 5 - Проблемы, которые мы обнаружили на нашем пути, и экстремальные настройки.

***

Раздел 1 - Введение в FMOD и адаптивную музыку

В этом разделе я кратко представлю FMOD, его назначение и опишу, что такое адаптивная музыка на нескольких примерах. Если вы уже все это знаете, пропустите эту часть.

Начну шире. Извините за это 😃

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

Когда Люк Скайуокер заходит в Кантину на Татуине, в «Новой надежде» звучит музыка, которую играет оркестр. Кинематографисты контролируют временную шкалу и могут микшировать музыку и звуковые эффекты во время пост-обработки. С другой стороны, игра - это живое существо. Вы, как разработчик игры, не знаете, когда это произойдет и как долго игрок будет находиться в этой области (если это не заранее подготовленная кат-сцена). Лучшим примером может служить боевая музыка в ролевой игре типа Kingdoms Come: Deliverance. Как только вас замечает враг, музыка меняется и становится более драматичной. Начало открытого боя сопровождается еще более драматичной музыкой. Конечно, есть игры, которые созданы на основе музыки. Например, в Geometry Dash или Beat Saber в качестве основной игровой механики используется музыка. Так, что геймплей и дизайн уровней основаны на музыке, а не наоборот.

Процесс, при котором обстоятельства меняют настроение музыки на другое, обычно называют адаптивной музыкой. Это зависит от ваших потребностей и от того, как вы хотите повлиять на игрока или привлечь его внимание музыкой. Это может быть смена фоновой музыки, как в World of Warcraft, когда игрок переходит в новое место. Или музыка может содержать важную информацию, такую ​​как статус шкалы здоровья игрока или уровень скрытности.

FMOD - это инструмент, который поможет вам связать действия игрока с самой музыкой. Есть несколько способов работы с адаптивной музыкой. Попробуйте загуглить horizontal resequencing или vertical reorchestration, и вы найдете множество туториалов по работе. Из этой части вы должны запомнить, что FMOD - это инструмент, который дает вам простой способ создания адаптивной музыки для видеоигр. Также имейте в виду, что FMOD состоит из двух отдельных частей.

  1. FMOD Studio - своего рода IDE, в которой вы разрабатываете адаптивную музыку и звуковые эффекты (но при этом не предназначена для написания самой музыки).
  2. Библиотека интеграции FMOD - библиотека, которая связывает созданный проект из FMOD Studio с вашим кодом, предоставляя высокоуровневый API.

***

Раздел 2 - Music Manager, связывающий интеграцию FMOD с нашей игрой

В этом разделе мы рассмотрим, как управлять музыкой и звуковыми эффектами из кода.

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

Во время первой сцены (сцена загрузки) мы создаем инстанс игрового объекта DontDestroyOnLoad. Этот объект представляет собой инстанс singleton, который можно вызывать из любого места кода.
MusicManager.cs - это скрипт, который выполняет единственную задачу. Он отвечает за взаимодействие между игрой и инстансом проекта FMOD.

Сам скрипт:

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

-2

Как вы можете видеть, musicVolumeParameter изменяет параметр FMOD MusicVolume, который имеет автоматизацию, привязанную к громкости мастер-трека. Это линейно уменьшает громкость выходного сигнала, это очень простой пример. Как только вы окунетесь в FMOD Studio, вы поймете, что можете управлять чем угодно, задав числовые значения инстансу параметра. Вы даже можете управлять несколькими регуляторами и эффектами с помощью одного параметра, поэтому его легко настраивать и масштабировать в соответствии с вашими потребностями.

***

Раздел 3 - UX и музыка в мобильных играх

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

Представьте, что одновременно проигрываются две несвязанные друг с другом музыкальные композиции, результатом такого обычно будет ужасный микс. Поэтому мы решили остановить воспроизведение музыки в фоновом режиме (Spotify или Apple Music) при запуске игры. Отмечу, что при интеграции FMOD Unity ведет себя довольно странно. Именно это в основном и наблюдалось в процессе всей нашей разработки.

Прежде всего, в Unity вы можете заставить внешние музыкальные проигрыватели останавливаться при запуске игры, установив флажок Mute Other Audio Sources (Отключить другие источники звука) в настройках проигрывателя.

                                      опция Mute Other Audio Sources
опция Mute Other Audio Sources

Но, если вы включите в настройках проекта -> Аудио -> Отключить Unity Audio (Project Settings -> Audio -> Disable Unity Audio), этот параметр будет проигнорирован! Не спрашивайте меня, почему 😃. Судя по тому, что я читал об этой проблеме, это желаемое поведение. Так что это не баг, это фича.

После того, как поставите галочку Disable Unity Audio, не ждите работы опции Mute Other Audio Sources
После того, как поставите галочку Disable Unity Audio, не ждите работы опции Mute Other Audio Sources

Комбинация из опций Disable Unity Audio (Отключить звук Unity) и любое значение в (Mute Other Audio Sources) «Отключить другие источники звука» всегда останавливает встроенный в мобильное устройство музыкальный проигрыватель (наблюдается на платформе iOS). Вот официальное руководство по установке со страницы устранения неполадок FMOD.

Обычно рекомендуется отключить встроенный звук Unity, но на некоторых платформах работает не всегда корректно. * Xbox One, iOS и Wii U требуют отключения встроенного звука Unity при использовании интеграции FMOD.- https://www.fmod.com/resources/documentation-api?version=1.10&page=content/generated/engine_new_unity/troubleshooting.html
2019 Июнь 26

В последующей версии FMOD Studio 2.0 они рекомендуют отключить звук Unity для всех платформ.

Давайте немного усложним ситуацию и займемся UX

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

Мы копнули поглубже в код FMOD C# , чтобы обнаружить, что FMOD останавливает встроенный в мобильное устройство музыкальный проигрыватель каждый раз, когда идёт переключение на приложение (focus). Поиск жизненных циклов методов Unity OnApplicationFocus и OnApplicationPause внутри скрипта RuntimeManager.cs и комментирование этих фрагментов кода не решило проблему с остановкой встроенного музыкального проигрывателя при первом запуске. Это только помогает, в случае, если вы приостановите приложение, нажмете кнопку воспроизведения в музыкальном проигрывателе и возобновите приложение, тогда родной плеер будет играть. таким образом мы оказались на полпути. Последний шаг - найти код, который останавливает проигрыватель на этапе инициализации приложения. Из наблюдений, можно обнаружить, что музыкальный проигрыватель останавливается после запуска приложения, даже до того, как отображается логотип Unity 😳. Какого черта? Это момент, когда FMOD не создается, поэтому он данная проблема не имеет ничего общего с самим FMOD. Что ж, проблема в том, что флаг Mute Other Audio Sources (Отключить другие источники звука) не соблюдается, если вы отключите Unity Audio.

Финальное решение


Мы написали сценарий постпроцессной сборки C# , который изменяет созданные файлы проекта XCode. В частности, нам нужно добавить две строки в файл

XCODE_BUILD_PATH/Classes/main.mm .

В main.mm были добавлены строки 1 и 7.

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

Важной частью является проверка всех существующих строк в скрипте. Этот файл не перезаписывается во время сборки «Добавить» (“Append” build). Иначе вы получите несколько дубликатов.

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

Методы внутри скрипта NativeMusicController.cs, начинающиеся с подчеркивания, импортируются из встроенных плагинов (native plugins).

ак видите, мы вызываем какой-то встроенный плагин (native plugins). Его код находится в репозитории на Github (ссылка в конце статьи). Вызывая метод TryToStopMusic, мы проверяем условие. Если условие выполнено, мы сообщаем инстансу музыкального проигрывателя ОС, что игра требует приоритета по звуку внутри игры. Вызывая ClearAudioFocus, мы освобождаем инстанс музыки, чтобы он был доступен для другого приложения. Мы вызываем TryToStopMusic во время первой инициализации игры, а также во время перехода между приостановленным и запущенным состояниями приложения.

***

Раздел 4 -Native Plugin (Плагин iOS и Android для управления встроенным музыкальным проигрывателем в ОС)

В этом разделе вы узнаете, как работает собственный плагин для iOS и Android. Мы также открыли исходный код плагина под LGPL, вы можете найти ссылку в конце статьи.

Как iOS, и Android используют свои API, у которых есть доступ к музыкальному проигрывателю ОС. Вы можете установить режим воспроизведения, который требуется вашему приложению. Вы можете найти все режимы в документации iOS и Android. Встроенный плагин состоит из трех частей. Один из них - это, конечно, нативный код, написанный на родном языке устройства. Другой - это мост между C# и собственным кодом, который экспортируется как API для плагина. И последняя часть - это код C# , который импортирует API, предоставляемый библиотекой/плагином, и использует его в коде C# . Ниже я покажу всё на примере iOS.

Файл заголовка MusicNativePlugin.h использующий API

скрипт MusicNativePlugin.m, который обеспечивает реализацию API

Конечный вид скрипта NativeMusicController.cs:

Скрипт NativeMusicController.cs, который импортирует API из нативных скриптов для мобильных устройств и вызывает открытые методы (exposed methods).

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

***

Раздел 5 - Проблемы, с которыми мы столкнулись или которые мы решили

Я повторюсь самые большие проблемы, которые у нас были, появлялись, в основном, из-за отсутствия документации на стороне Unity и FMOD. Чтобы убедиться, как Unity ведет себя при установке флага Disable Unity Audio, нам пришлось создать пустой проект и протестировать его поведение. Потому что мы не были уверены, вызвана ли проблема интеграцией FMOD или нашим отсутствием знаний о том, как ее правильно использовать.
Одна проблема, о которой не упоминалось выше, заключается в том, что мы используем Unity Cloud Build (UCB) во время нашей разработки. Это значительно упрощает нашу работу по тестированию открытых запросов на вытягивание внутри нашей команды. Во время сборки UCB FMOD не копирует вновь созданные банки в нашу папку Streaming Assets. Хотя похоже, что мы решили эту проблему, включив тесты режима воспроизведения перед сборкой. Но пока точно сказать об этом не можем, и мы все еще изучаем этот вопрос.

***

Рекомендации

Jan Slifka написал отличную статью об автоматизации процесса сборки с помощью Unity Cloud Build. Пользовательское решение, использующее веб-перехватчики BitBucket и создающее новую сборку при появлении нового запроса на слияние.
Также есть
отличная статья Ondrej Kofron о производительности скриптов C# .
И мои коллеги напишут больше статей о шейдерах Unity, и мы расскажем больше о нашей игре в ближайшие недели. Поэтому, пожалуйста, нажмите кнопку подписки на Lonely Vertex на
Medium, Twitter, Instagram и подпишитесь на новости на нашей странице в Facebook.
Репозиторий GitHub со всем вспомогательным кодом можно найти
здесь. Если у вас есть какие-либо проблемы, вы можете написать их на GitHub и не стесняйтесь нажимать Pull Request для любых доработок.

***

Заключительные слова

Не стесняйтесь оставлять комментарии ниже, если вам понравилась статья, вы хотите задать вопрос или предложить лучший подход. Как я уже сказал, это не лучшая практика или мантра о том, как работать с музыкой в ​​играх. Это подход, который мы использовали, и он работает в нашем случае использования. Мы хотели поделиться им, потому что думали, что это может быть полезно другим новичкам в индустрии разработки игр.
В следующий раз я напишу статью о том, как мы решили
локализацию нашей игры.
Мы
Lonely Vertex, небольшая студия инди-игр, расположенная в Праге, Чешская Республика. В настоящее время готовимся к выпуску нашей первой игры Sine. Вы можете подписаться на рассылку, читать наши статьи в блоге о разработке или следить за нашим прогрессом в Twitter или Facebook.
Cheers, JK.

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

#unity #unity3d #fmod #audioengine #gamedev #sounddesign #саунддизайн