Воспроизведение звуковых событий (ивентов) FMOD в Unity
Воспроизведение событий FMOD (далее ивентов) в Unity не представляет особой сложности, но у нас есть ряд доступных методов, которые могут иметь больший или меньший смысл в зависимости от наших задач. В этом уроке я представлю обзор доступных методов для запуска и воспроизведения наших ивентов.
Скачайте проект Unity & FMOD для этого руководства. Если после открытия проекта у вас возникнут какие-либо ошибки, удалите файл FMODStudioCache.asset, поскольку он содержит старый путь к проекту FMOD Studio.
Мы можем воспроизвести ивенты FMOD тремя различными способами:
Все эти способы имеют практические преимущества и недостатки:
Для простого воспроизведения ивентов мы создаем новый GameObject и вставляем компонент Studio Event Emitter в инспектор Unity:
Здесь мы находим несколько настроек, с помощью которых мы можем влиять на воспроизведение ивентов. С помощью Play Event и Stop Event мы определяем, когда ивент должно быть активировано и остановлено. С помощью Event мы выбираем ивент из списка ранее созданных ивентов. Включайте и выключайте этот GameObject, чтобы услышать, как работает звук.
Метод 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) - это звуковые системы, созданный в FMOD Studio , который может содержать различные треки, параметры и автоматизацию. В игре создается копия или инстанс ивента. В игре запускается не сам ивент, а его инстанс (instance). Это позволяет одновременно воспроизводить несколько копий ивента.
Чтобы вручную воспроизвести и управлять ивентом FMOD в Unity , необходимо выполнить четыре шага:
Давайте теперь рассмотрим эти моменты шаг за шагом.
Прежде чем продолжить, нам нужно объявить все ивенты, которые будут использоваться в этом скрипте в виде instance. В нашем случае мы вставим эту строку в код:
private FMOD.Studio.EventInstance instance;
Затем в функции Unity Start() мы создаем инстанс для нашего ивента:
void Start ()
{
instance = FMODUnity.RuntimeManager.CreateInstance(“ event :/Esempio”);
}
После этого звук можно воспроизвести с помощью метода instance.start(). Я также поместил строку кода в метод Update() внутри оператора if , чтобы звук воспроизводился только при нажатии клавиши пробел:
if (Input.GetKeyDown(KeyCode.Space))
{
instance .start ();
}
Если мы еще раз посмотрим на окно отладки FMOD в верхнем левом углу, вы, вероятно, заметите, что по сравнению с PlayOneshot при многократном нажатии клавиши пробела будет воспроизводиться только один инстанс ивента. Звук будет прерываться каждый раз, когда мы повторно нажимаем пробел. Это происходит потому, что мы создали инстанс в методе Unity Start(). Эта функция выполняется один раз при запуске игры. Если мы хотим иметь отдельный инстанс для каждого воспроизводимого звука, нам также необходимо поместить код создания инстанса в блок оператора if .
Предупреждение: При использовании этого метода ручного запуска инстансы не выгружаются из памяти автоматически. Это может вызвать проблемы. Мы добавляем код instance.release() после запуска инстанса, чтобы он был выгружен из памяти после воспроизведения.
Полный код этого примера:
Лупы ( loops ) можно безопасно выполнять и через метод ручного ввода. Но как создаются лупы и как их остановить?
Вернемся в FMOD Studio и посмотрим на ивент LoopEvent в проекте. Вы можете создать луп-регион, щелкнув правой кнопкой мыши и выбрав Add Loop Region :
Мы можем менять область лупа как угодно, аналогично функции loop в некоторых DAW . Мы изменим область лупа так, чтобы включить весь аудиофайл, сохраняем и генерируем проект.
В проекте Unity запустите сцену Loop и нажмите пробел. Ивент будет воспроизводиться в непрерывном цикле.
Этой строчкой кода :
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-ивенты отличаются от 2D-ивентов тем, что они воспроизводят 3D-звук с при помощи дополнительного эффекта Spatializer . Он меняет интенсивность громкости в зависимости от расстояния между FMOD инстансом и слушателем и панораму звучания в зависимости от положения звукового инстанса относительно слушателя.
Ивент не обязательно требует эффекта Spatializer , чтобы быть трехмерным ивентом. Оно также может использовать встроенные параметры (например, расстояние, направление и т. д.) Для автоматизации таких свойств, как громкость и частотные фильтры, для создания эффекта нахождения звука в пространстве.
В FMOD Studio 2D-ивент можно легко преобразовать в 3D-ивент, добавив к мастер-треку эффект Spatializer:
Теперь я кратко объясню наиболее важные настройки Spatializer :
В самом коде нам просто нужно внести небольшое изменение, то есть сообщить FMOD, где находится инстанс в трехмерном пространстве. У нас также есть два разных варианта. Или мы устанавливаем трехмерные атрибуты непосредственно в функции Update () объекта скрипт с этой строкой кода:
instance.set3DAttributes(FMODUnity.RuntimeUtils.To3DAttributes(gameObject));
Или мы добавляем информацию в объект GameObject после создания инстанса:
FMODUnity.RuntimeManager.AttachInstanceToGameObject(instance, GetComponent<Transform>(), GetComponent<Rigidbody>());
В зависимости от того, имеет ли GameObject Rigidbody или нет, мы можем использовать один из двух методов. Второй метод использует Rigidbody для определения скорости GameObject и активации возможного эффекта Доплера.
Код для 3D-ивента может быть записан как-то так:
В прикрепленной сцене 3DEvent используйте клавиши WASD и правую кнопку мыши, чтобы перемещаться по комнате и слышать, как звук будет реагировать на движение.