Обзор основных функций системы FMOD + Unity


Написание скриптов FMOD-Unity: Основы


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

Оглавление:
1. Cheat Sheet
2. Воспроизведение звука
3. Размещение звука в пространстве
4. Отслеживание экземпляров звуковых событий (далее инстансов ивентов) (Event Instances)
5. Циклические звуки
6. Остановка звуков
7. Вызов Cues (отключение точек сустейна) 8. Настройка параметров (Parameters)
9. Ссылки на источник звука - эмитеров (Emitter)
10. Глобальные Параметры (Global Parameters)
11. Снепшоты для шин и групп (Mixer/Group Snapshots)
12. Обратные вызовы событий - колбеки ивентов (Event Callbacks)

Cheat Sheet

Краткий список общих функций FMOD Unity:

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

Следующий скрипт будет воспроизводить одиночное звуковое событие (далее ивент) (event) как 2D-звук (стерео/непозиционируемый) всякий раз, когда вызывается функция PlayASound .

Кроме того, размещение PlayOneShot() в void Awake(), void Start() или void OnEnable() - это простые способы начать воспроизведение звукового ивента при создании или включении объекта. Примером использования для этого являются звуковые эффекты стрельбы снарядами. В случаях, когда снаряды создаются и уничтожаются, void Start() обычно является правильным местом для того чтобы проиграть ивент. А в ситуации, когда они предварительно создаются (объединяются в пул) и включаются при использовании, наилучшей альтернативой станет OnEnable().

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

Размещение звука в пространстве:

Первый и самый простой способ воспроизвести звук в указанном (фиксированном) месте - использовать перегрузка процедуры position (Vector 3) для функции FMOD PlayOneShot .

Кроме того, PlayOneShot не будет динамически отслеживать положение объектов. Он будет привязан к месту, указанному при вызове функции. Для динамического позиционирования нужно будет рассматривать некоторые из следующих (более сложных) вариантов.

Для многих целей PlayOneShotAttached - лучшее решение для воспроизведения звука, который следует за объектом. Он работает так же, как PlayOneShot, но вместо воспроизведения звука в фиксированном месте он будет отслеживать положение объекта, к которому он прикреплен, в течение всего времени существования звукового ивента.

Отслеживание инстансов ивентов (Event Instances )

Во многих случаях (loops, cues, parameters и т. д.) нам нужен доступ к звуковому ивенту после начала воспроизведения. В этих случаях вместо использования функций PlayOneShot  мы сохраним ссылку на EventInstance , вызвав CreateInstance  для имени ивента (строковый путь)( event name (string path) ). Чтобы начать воспроизведение ивента, нам просто нужно вызвать start () для EventInstance . Обратите внимание, что всякий раз, когда звук создается с помощью CreateInstance , он также должен быть выгружен из памяти в какой-то момент, чтобы избежать утечки памяти. Освобождение EventInstance пометит ивент для уничтожения, но оно будет уничтожено только после того, как прекратит воспроизведение.

Возвращаясь на время к нашей предыдущей теме, при создании и запуске воспроизведения EventInstance по-прежнему отсутствуют данные о позиции объекта. Если мы хотим отслеживать положение объекта, мы можем либо прикрепить экземпляр к объекту с помощью AttachInstanceToGameObject(), либо вручную привязать объект ( object ) и твердое тело ( rigidbody ) (для отслеживания положения и скорости) с помощью set 3 DAttributes() . Как правило, все, что нужно - это первый вариант.

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

Циклические звуки:

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

Для этого нам нужно:

· вызвать команду stop на шине/группе, через которую воспроизводится звук (подробнее об этом позже),

· уничтожить объект, к которому прикреплен звук,

· перезагрузить сцену или часть сцены, в которой объект находится (не самый лучший способ),

· перейти из сегмента цикла

· вызвать событие stop() в самом инстансе ивента.

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

Остановка звуков

Как упоминалось выше, циклические звуки и однократные звуки, а также снепшоты микшера ( snapshots ) обрабатываются как ивенты и могут быть остановлены аналогичным образом. Для этого метода требуется ссылка на EventInstance , и он может останавливаться в одном из двух режимов; режим немедленной остановки или режим постепенного затухания, в котором кривая затухания соответствует кривой «затухания» громкости AHDSR для звукового ивента в FMOD.

Стоит отметить, что, если звук или группу звуков необходимо остановить сразу, но у вас нет доступа к ссылкам для любого или всех из них, стоп-вызов может быть вызван для всех ивентов на данной шине/микшерной группе (bus/mix group). Я считаю, что это требует значительных вычислительных затрат, но это очень полезно для нечастых вызовов, таких как изменение уровня или карты, или переходы между различными игровыми состояниями (например, от мира до битвы в пошаговой игре).

Вызов Cues (отключение точек сустейна)

Одним из распространенных способов использования точек сустейна в FMOD является обеспечение зацикливания асинхронных аудиоклипов, хотя их использование может выходить далеко за рамки этого. Независимо от варианта использования, точка сустейна должна быть отключена (key off), чтобы по таймлайну пройти после нее в FMOD . Чтобы сделать это, мы просто вызываем triggerCue () для ивента с меткой (cue). Опять же, для этого действия требуется ссылка EventInstance .

Примечание. При запуске сигналов до того, как указатель воспроизведения достиг следующей точки сустейна, эта точка сустейна будет проигнорирована. Каждый вызов triggerCue () будет отключать только следующую точку сустейна в последовательности, однако несколько вызовов triggerCue () могут быть помещены в буфер. Из-за этого взаимодействия иногда полезно использовать маркеры назначения ( destination markers ) и области переходов ( transition regions ), когда требуется более высокая сложность или точность. Области переходов ( transition regions ) реагируют на назначения параметров FMOD ( parameters ) и ждут выполнения определенных условий в рамках этих параметров ( parameters ).

Настройка параметров (Parameters

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

Несмотря на комплексность параметров FMOD , написание скрипта для них оказывается относительно простым. Для доступа к локальным параметрам отдельных ивентов FMOD , как и в случае с метками (cue), требуется ссылка EventInstance . Кроме этого, ивент необходимо просто запустить. При старте ивента, сначала установите параметр (parameter) в первом кадре после запуска вызова. Это относится конкретно к звукам, которые запускаются в скрипте.

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

Ссылки на источник звука - эмитеров (Emitter)

Давайте вместо того, чтобы запустить звуки из компонента Studio Event Emitter , захватим их с помощью переменной EmitterRef . Затем мы можем начать воспроизведение с помощью функции эмиттера Target.Play () и можем установить параметры, доступные для редактирования, с помощью Target.SetParameter() .

Примечание. Лично я предпочитаю не использовать переменные EmitterRef, когда можно этого избежать, поскольку, несмотря на дополнительную доступность в редакторе, по-прежнему требуется ручной ввод строк с учетом регистра, и есть дополнительная нагрузка в отслеживании индексного значения Params[] для параметра, в который вы хотите внести изменения, внутри массива. 

Глобальные параметры (Global Parameters) 

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

В отличие от локальных параметров, к глобальным параметрам можно получить доступ в редакторе с помощью атрибута ParamRef . Кроме того, как и в случае с локальными функциями setParameter , глобальные параметры также могут быть установлены по идентификатору и по массиву идентификаторов.

Снепшоты для шин и групп (Mixer/Group Snapshots) 

Снепшоты для шин, или групповые снепшоты (Group Snapshots) (как их называет FMOD) функционируют по существу идентично звуковым ивентам и могут рассматриваться как своего рода глобальный звуковой ивент. С учетом сказанного, они ведут себя больше похоже на циклические звуки, чем на однократные звуки, в том смысле, что они будут сохраняться до тех пор, пока не будут остановлены вручную или принудительно. Затухание может быть применено к снимкам микшера через время атаки и восстановления (AHDSR) на различных «макросах снимков», «измерителе интенсивности», а также на любых измененных параметрах снимка (хотя и менее последовательно, когда присутствует сложность). Как и в случае стандартных ивентов остановки, релиз фейда также можно обойти с помощью режима немедленной остановки.

Обратные вызовы событий - колбеки ивентов (Event Callbacks) 

 

Обратные вызовы ивентов (Event Callbacks) - это очень "необычный зверь". Их можно использовать для отслеживания и обратной реакции игрового мира практически на любое изменение состояния звуковой системы в рамках ивента. Однако, самое главное для меня, это их способность отслеживать маркеры шкалы времени и темп. Если вы хотите создавать системы которые реагируют на музыку, это хорошая отправная точка.

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

Вся информация верна для FMOD версии 2.00.05

Даты проведения следующих групповых онлайн-курсов XSSR Academy:

Для того, чтобы не пропустить набор на курсы мы подготовили для вас телеграм-бота, в котором будет вся актуальная новостная информация!

Ссылка: https://t.me/INFO_XSSR_bot