Воспроизведение звуковых событий (ивентов) FMOD в Unity
Воспроизведение звуковых событий (ивентов) FMOD в Unity
Воспроизведение событий FMOD (далее ивентов) в Unity не представляет особой сложности, но у нас есть ряд доступных методов, которые могут иметь больший или меньший смысл в зависимости от наших задач. В этом уроке я представлю обзор доступных методов для запуска и воспроизведения наших ивентов.
Скачайте проект Unity & FMOD для этого руководства. Если после открытия проекта у вас возникнут какие-либо ошибки, удалите файл FMODStudioCache.asset, поскольку он содержит старый путь к проекту FMOD Studio.
Оглавление:
- Как мы можем проиграть ивенты (event) FMOD в Unity ?
- Воспроизведение ивентов (events) FMOD с помощью компонента Studio Event Emitter
- PlayOneShot
- В чем разница между ивентом (event) и инстансом (instance)?
- Настройка воспроизведения и управление ивентами (events) FMOD вручную через код
- Объявление инстанса у ивента FMOD
- Создание инстанса у ивента FMOD
- Воспроизведение инстанса ивента FMOD
- Как проигрывать лупы (loop) с использованием FMOD и Unity?
- Как остановить луп ивента FMOD в Unity?
- Воспроизведение 3D-ивентов FMOD в Unity
Как мы можем проиграть ивенты (event) FMOD в Unity?
Мы можем воспроизвести ивенты FMOD тремя различными способами:
- С помощью компонента FMOD Studio Event Emitter .
- Вызывая комплексную функцию PlayOneShot в коде.
- С объявлением запуска/остановки ивента в коде.
Все эти способы имеют практические преимущества и недостатки:
- Event Emitter позволяет нам воспроизводить ивента без кода. В сочетании с компонентом Studio Parameter Trigger можно дополнительно модулировать параметры ивента.
- С помощью вспомогательной функции PlayOneShot мы можем воспроизвести ивент с помощью одной строки кода. FMOD автоматически выполняет воспроизведение и останавливает или освобождает инстанс (instance) звука из памяти. Недостатком этого метода является невозможность изменения параметров ивента. Если нужно изменить звук с помощью игрового параметра, PlayOneShot не подходит.
- С другой стороны, ручная настройка воспроизведения ивентом требует большего количества кода, но является гораздо более гибким, поскольку можно точно определить, когда звук или цикл должны воспроизводиться и останавливаться, а также где должны выполняться модуляции параметров.
Воспроизведение ивентов (events) FMOD с помощью компонента Studio Event Emitter
Для простого воспроизведения ивентов мы создаем новый GameObject и вставляем компонент Studio Event Emitter в инспектор Unity:
Здесь мы находим несколько настроек, с помощью которых мы можем влиять на воспроизведение ивентов. С помощью Play Event и Stop Event мы определяем, когда ивент должно быть активировано и остановлено. С помощью Event мы выбираем ивент из списка ранее созданных ивентов. Включайте и выключайте этот GameObject, чтобы услышать, как работает звук.
PlayOneShot
Метод PlayOneShot мгновенно создает инстанс (экземпляр) ивента в определенном месте (по умолчанию источником будет GameObject ). Звук будет воспроизводиться полностью, и параметры не могут быть установлены, как в способе выше. Код для PlayOneShot :
FMODUnity.RuntimeManager.PlayOneShot( "event:/Example" );
event:/Example - это путь, который относится к ивенту, которое мы создали в FMOD Studio. Пути следуют структуре папок в FMOD Studio, поэтому мы можем просто ввести их вручную в код. Кроме того, вы можете щелкнуть правой кнопкой мыши по ивенту в FMOD Studio, чтобы скопировать его путь.
Помещаем код в метод скрипта Update(). В условном операторе if мы проверяем, была ли нажата клавиша «пробел», и в этом случае будет воспроизводиться звук:
if (Input.GetKeyDown(Keycode.Space))
{
FMODUnity.RuntimeManager.PlayOneShot( "event:/Example" );
}
Полный код для использования функции PlayOneShot :
Если вы теперь перейдете в режим воспроизведения и нажмете пробел, вы услышите звук, который вы добавили в ивент, созданный в FMOD Studio. В верхнем левом углу вы также увидите небольшое окно отладки, показывающее громкость в RMS и количество активных записей:
В чем разница между ивентом (event) и инстансом (instance) ?
Ивент(event) - это звуковые системы, созданный в FMOD Studio , который может содержать различные треки, параметры и автоматизацию. В игре создается копия или инстанс ивента. В игре запускается не сам ивент, а его инстанс (instance). Это позволяет одновременно воспроизводить несколько копий ивента.
Настройка воспроизведения и управление ивентами (events) FMOD вручную через код С#
Чтобы вручную воспроизвести и управлять ивентом FMOD в Unity , необходимо выполнить четыре шага:
- Нам нужно объявить инстанс ивента FMOD
- Сообщить Unity , когда должен быть создан ивент FMOD и где этот ивент находится.
- Активировать и/или деактивировать инстанс ивента
- Выгрузить инстанс из памяти.
Давайте теперь рассмотрим эти моменты шаг за шагом.
Объявление инстанса у ивента FMOD
Прежде чем продолжить, нам нужно объявить все ивенты, которые будут использоваться в этом скрипте в виде instance. В нашем случае мы вставим эту строку в код:
private FMOD.Studio.EventInstance instance;
Создание инстанса у ивента FMOD
Затем в функции Unity Start() мы создаем инстанс для нашего ивента:
void Start ()
{
instance = FMODUnity.RuntimeManager.CreateInstance(“ event :/Esempio”);
}
Воспроизведение инстанса ивента FMOD
После этого звук можно воспроизвести с помощью метода instance.start(). Я также поместил строку кода в метод Update() внутри оператора if , чтобы звук воспроизводился только при нажатии клавиши пробел:
if (Input.GetKeyDown(KeyCode.Space))
{
instance .start ();
}
Если мы еще раз посмотрим на окно отладки FMOD в верхнем левом углу, вы, вероятно, заметите, что по сравнению с PlayOneshot при многократном нажатии клавиши пробела будет воспроизводиться только один инстанс ивента. Звук будет прерываться каждый раз, когда мы повторно нажимаем пробел. Это происходит потому, что мы создали инстанс в методе Unity Start(). Эта функция выполняется один раз при запуске игры. Если мы хотим иметь отдельный инстанс для каждого воспроизводимого звука, нам также необходимо поместить код создания инстанса в блок оператора if .
Предупреждение: При использовании этого метода ручного запуска инстансы не выгружаются из памяти автоматически. Это может вызвать проблемы. Мы добавляем код instance.release() после запуска инстанса, чтобы он был выгружен из памяти после воспроизведения.
Полный код этого примера:
Как проигрывать лупы (loop) с использованием FMOD и Unity?
Лупы ( loops ) можно безопасно выполнять и через метод ручного ввода. Но как создаются лупы и как их остановить?
Вернемся в FMOD Studio и посмотрим на ивент LoopEvent в проекте. Вы можете создать луп-регион, щелкнув правой кнопкой мыши и выбрав Add Loop Region :
Мы можем менять область лупа как угодно, аналогично функции loop в некоторых DAW . Мы изменим область лупа так, чтобы включить весь аудиофайл, сохраняем и генерируем проект.
В проекте Unity запустите сцену Loop и нажмите пробел. Ивент будет воспроизводиться в непрерывном цикле.
Как остановить луп ивента FMOD в Unity?
Этой строчкой кода :
instance.stop(FMOD.Studio.STOP_MODE.ALLOWFADEOUT);
мы можем остановить инстанс ивента. В функции Update () мы снова вставляем оператор if, который остановит наш звук, при нажатии на клавишу "левый контрол(CTRL)":
if (Input.GetKeyDown(KeyCode.LeftControl))
{
instance.stop(FMOD.Studio.STOP_MODE.ALLOWFADEOUT);
instance.release();
}
STOP _ MODE.ALLOWFADEOUT учитывает время релиза ( release ) в ADSR модуляции ивента (если она есть). Если вместо этого мы хотим, чтобы звук немедленно прекратился, мы используем STOP_MODE.IMMEDIATE.
Полный код для лупов такой:
Теперь мы можем поочередно воспроизводить и останавливать наш звуковой луп с помощью клавиш пробел и левый контрол.
Воспроизведение 3D-ивентов FMOD в Unity
3D-ивенты отличаются от 2D-ивентов тем, что они воспроизводят 3D-звук с при помощи дополнительного эффекта Spatializer . Он меняет интенсивность громкости в зависимости от расстояния между FMOD инстансом и слушателем и панораму звучания в зависимости от положения звукового инстанса относительно слушателя.
Ивент не обязательно требует эффекта Spatializer , чтобы быть трехмерным ивентом. Оно также может использовать встроенные параметры (например, расстояние, направление и т. д.) Для автоматизации таких свойств, как громкость и частотные фильтры, для создания эффекта нахождения звука в пространстве.
В FMOD Studio 2D-ивент можно легко преобразовать в 3D-ивент, добавив к мастер-треку эффект Spatializer:
Теперь я кратко объясню наиболее важные настройки Spatializer :
- Минимальное и максимальное расстояние (Min & Max Distance) и кривая ослабления расстояния (Distance Attenuation): эти свойства Spatializer определяют, насколько сигнал ослабляется на разных расстояниях. Сигнал не ослабляется, если слушатель находится на минимальном расстоянии от Spatializer, и становится "минус бесконечность" дБ, если слушатель вышел за пределы максимального расстояния, а также сигнал уменьшается по линейно-квадратичной кривой по мере того, как слушатель удаляется от минимального расстояния до максимального расстояния. Сигнал может изменяться по-разному, в зависимости от того как настроена кривая.
- Envelopment: Envelopment определяет заполнение пространства звуковым ивентом на любом расстоянии от слушателя. В автоматическом режиме (Auto) минимальная ширина (expansion) устанавливается на 0 градусов, а для параметра объем звука (Sound Size) устанавливается значение, в два раза превышающее свойство минимальное расстояние Spatializer (Min-Distance Spatializer).
- Пользовательский режим (User mode) позволяет нам вручную установить размер звука (sound size) и минимальное расширение (minimum expansion) Spatializer, в то время как режим Off отключает размер звука (sound size) и минимальное расширение (minimum expansion).
В самом коде нам просто нужно внести небольшое изменение, то есть сообщить FMOD, где находится инстанс в трехмерном пространстве. У нас также есть два разных варианта. Или мы устанавливаем трехмерные атрибуты непосредственно в функции Update () объекта скрипт с этой строкой кода:
instance.set3DAttributes(FMODUnity.RuntimeUtils.To3DAttributes(gameObject));
Или мы добавляем информацию в объект GameObject после создания инстанса:
FMODUnity.RuntimeManager.AttachInstanceToGameObject(instance, GetComponent<Transform>(), GetComponent<Rigidbody>());
В зависимости от того, имеет ли GameObject Rigidbody или нет, мы можем использовать один из двух методов. Второй метод использует Rigidbody для определения скорости GameObject и активации возможного эффекта Доплера.
Код для 3D-ивента может быть записан как-то так:
В прикрепленной сцене 3DEvent используйте клавиши WASD и правую кнопку мыши, чтобы перемещаться по комнате и слышать, как звук будет реагировать на движение.