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

Существует довольно много документации по интеграции FMOD Unity и сценариям, но большая часть ее разбросана, дезорганизована и похоронена в сообщениях на форуме или видео.

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

Я надеюсь, что эта документация облегчит бремя поиска простых сценариев FMOD в будущем.

Индекс:

Памятка:

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

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

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

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

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

Размещение звука:

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

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

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

PlayOneShot и PlayOneShotAttached обычно охватывают большую часть простого однократного управления звуковыми событиями, однако ни одна из этих стратегий не обеспечивает легкий доступ (или большую часть любого доступа) к звуковым событиям после их начала. Многие функции FMOD требуют или значительно упрощаются за счет доступа к экземпляру звукового события после его запуска. Несколько примеров сценариев включают остановку воспроизведения петли, отключение точек сустейна и установку параметров FMOD для определенных звуковых событий. Я расскажу о каждом из них ниже.

Отслеживание экземпляров событий:

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

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

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

Повторяющиеся звуки:

Другое использование для отслеживания экземпляров событий возникает при зацикливании воспроизведения звуков. FMOD обрабатывает циклические звуковые события точно так же, как и однократные события. С учетом сказанного, мы почти всегда захотим остановить цикл в какой-то момент. Для этого нам нужно либо вызвать stop на шине / группе, через которую воспроизводится звук (подробнее об этом позже), либо уничтожить объект, к которому прикреплен звук, либо перезагрузить сцену или часть сцены, в которой объект находится в (редко лучший подход), перейти из сегмента цикла или вызвать событие stop () в самом экземпляре события.
Последние два параметра, как правило, обеспечивают максимальную гибкость и в обоих случаях (обычно ) требуется ссылка на экземпляр события для вызова необходимых функций.

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

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

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

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

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

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

Параметры настройки:

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

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

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

Ссылки на эмитента:

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

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

Глобальные параметры:

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

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

Снимки микшера / группы:

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

Обратные вызовы событий:

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

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

Пожалуйста, свяжитесь со мной и сообщите мне, если что-то в этом документе сбивает с толку или кажется, что оно размещено неправильно, и я сделаю все возможное, чтобы вернуться к вам и внести в документ необходимые поправки. Удачи!

Актуально до версии FMOD 2.00.05