перевод оригинальной статьи Алессандро Фама - Controlling FMOD Parameters in Unity (туториал сделан по FMOD версии 2.00.хх)
Параметры FMOD полезны для внесения изменений в события или снимки FMOD с использованием игровых переменных. Если мы хотим динамически изменять нашу музыку или связывать звуки с определенными переменными: использование параметров важно и весело!
Загрузите проект Unity & FMOD для этого руководства. Если после открытия проекта у вас возникнут какие-либо ошибки, удалите файл FMODStudioCache.asset, поскольку он по-прежнему будет содержать старый путь к проекту FMOD Studio.
Видео версия туториала (на английском языке):
***
Оглавление
- Как параметры FMOD работают в FMOD Studio?
- Типы параметров в FMOD Studio
- Непрерывные параметры (Continuous Parameters)
- Дискретные параметры (Discrete Parameters)
- Маркированные параметры (Labeled Parameters)
- Управление параметрами FMOD с помощью компонента Studio Parameter Trigger в Unity
- Управление параметрами FMOD с помощью кода C# в Unity
- Использование setParameterByID для управления параметрами FMOD в Unity
- Как использовать Глобальные Параметры (Global Parameters) в FMOD Studio и Unity?
- Изменение Глобальных Параметров (Global Parameters) с помощью компонента Global Parameter Trigger в Unity
- Управление Глобальными Параметрами (Global Parameters) с помощью кода C# в Unity
***
Как параметры FMOD работают в FMOD Studio?
Каждое событие FMOD(далее ивент)(event) начинается с параметра, называемого временной шкалой (timeline).
Временная шкала (timeline) имеет особую функцию автоматического продвижения: пока ивент воспроизводится, значение параметра временной шкалы непрерывно увеличивается. Представьте себе типичную временную шкалу DAW, которая идет линейно слева направо:
Другие параметры в совокупности называются игровыми параметрами (Game Parameters), потому что они используются для представления различных ситуаций внутри игры:
Текущее значение любого параметра можно динамически изменять в движке. Значениями параметров также можно управлять с помощью модуляторов или ивентов, которые связаны с ивентом, в котором находится параметр. У каждого экземпляра события(Instance) (далее инстанса ивента) могут быть разные значения параметров (Parameters), поэтому разные инстансы одного и того же ивента могут создавать очень разнообразное звучание.
Значения параметров могут обновляться с помощью кода в игре, но также могут быть настроены с помощью автоматизации или модуляторов.
В прилагаемом проекте я создал четыре параметра для инстанса, каждый из которых связан с эффектами FMOD Studio:
- Reverb: управляет wet значением эффекта реверберации (0-1).
- Delay: контролирует wet значение эффекта задержки (0-1)
- DelayTime: контролирует время задержки (0-5000 мс)
- Pitch: Управляет значением высоты тона инстанса (-12st - 12st).
Посмотрите на проект FMOD в папке Assets, чтобы понять, как параметры связаны с эффектами. Пройдите по вкладкам Игровых Параметров (Game Parameter) и взгляните на автоматизацию.
***
Типы параметров в FMOD Studio
В новой версии FMOD Studio 2.0.0 к существующим Непрерывным Параметрам (Continuous Parameters) были добавлены два новых типа параметров. Я процитирую глоссарий FMOD, чтобы кратко объяснить, как работают эти типы параметров:
Непрерывные параметры (Continuous Parameters)
Непрерывные параметры (Continuous Parameters) - это тип параметра, в котором используются числа с плавающей запятой (float). Каждый параметр имеет минимальное и максимальное значение и может быть установлен на любое значение с плавающей запятой в этом диапазоне. Как и все параметры, непрерывные пользовательские параметры (Continuous Parameter) можно настроить для представления любой переменной в игровом проекте. Непрерывные параметры (Continuous Parameters) чаще всего используются для переменных, которые могут изменяться с очень мелкими или произвольными приращениями.
Дискретные параметры (Discrete Parameters)
Дискретные параметры (Discrete Parameters) - это тип параметра, в котором используются целые числа (integer (int)). Каждый дискретный параметр (Discrete Parameter) имеет минимальное и максимальное значение и может быть установлен на любое целочисленное значение в этом диапазоне.
Маркированные параметры (Labeled Parameters)
Маркированные параметры (Labeled Parameters) - это тип параметра, в котором используются строковые переменные (string). Каждый маркированный параметр (Labeled Parameter) имеет предопределенный список заданных значений (labeled values) и может быть установлен на любое из этих значений (values).
Управление параметрами FMOD с помощью компонента Studio Parameter Trigger в Unity
Если мы хотим изменить параметры без кода, мы можем использовать компонент Studio Parameter Trigger в сочетании с компонентом Studio Event Emitter. Откройте сцену Parameter-Component и щелкните GameObject "Parameter", чтобы просмотреть оба компонента в Инспекторе:
Мы видим, как компонент Studio Event Emitter воспроизводит ивент в начале сцены, которое содержит четыре параметра в их значениях по умолчанию. Ниже приведены два компонента Studio Parameter Trigger, для которых в качестве триггеров используются отклики (callbacks) Mouse Enter и Mouse Exit. Первый компонент Studio Parameter Trigger устанавливает для параметра Reverb значение 1, а для параметра Pitch - 3. Второй компонент устанавливает для параметров значения по умолчанию.
Если в режиме воспроизведения игры (Play Mode) мы наведем мышью на куб, параметры изменятся на значения, которые мы установили. Если мы наведем указатель мыши на место за пределами куба, значения вернутся к настройкам по умолчанию. Попробуйте!
Управление параметрами FMOD с помощью кода C# в Unity
Конечно, весь процесс также можно очень просто описать на C# . Откройте сцену Parameter-Code и скрипт Effects.cs.
Как и в предыдущем туториале, мы в первую очередь объявим наш инстанс. На этот раз мы также объявляем строку с атрибутом [FMODUnity.EventRef], который позволяет нам выбрать ивент FMOD в инспекторе.
private FMOD.Studio.EventInstance instance;
[ FMODUnity.EventRef ]
public string fmodEvent;
Теперь мы также объявляем четыре разные переменные, которые будут изменять наши параметры FMOD в реальном времени:
[ SerializeField ] [Range( 0f , 1f )]
private float reverb, delay;
[ SerializeField ] [Range( 0f , 5000f )]
private float delayTime;
[ SerializeField ] [Range( -12f , 12f )]
private float pitch;
Атрибут [SerializeField] предназначен для доступа к частным переменным (private) в инспекторе. Атрибут Range [min, max] представляет эти переменные с помощью ползунка в инспекторе, что упрощает изменение этих значений.
В методе Start() в Unity мы создаем и запускаем наш инстанс (обратите внимание, как мы вводим здесь ранее объявленную строковую переменную (string) в качестве пути к ивентам):
void Start ( )
{
instance = FMODUnity.RuntimeManager.CreateInstance(fmodEvent);
instance.start();
}
Затем для каждого параметра FMOD в методе Update() мы используем метод setParameterByName для изменения параметров:
instance .setParameterByName ( "ParameterName" , value);
В целом сценарий выглядит так:
Запустите сцену и затем подвигайте ползунки в инспекторе.
Использование setParameterByID для управления параметрами FMOD в Unity
Другой способ изменить параметры в коде - кэшировать идентификатор параметра (Parameter Id) и установить значение параметра по идентификатору (id) вместо прямой передачи имени параметра в FMOD. Это требует немного больше кода, но работает намного быстрее при получении или установке параметров несколько раз.
Чтобы этого добиться нам нужно будет добавить ещё одну переменную в код. Такая строка будет объявлять объект структуры PARAMETER_ID для каждого параметра в начале класса:
private FMOD.Studio.PARAMETER_ID pitchParameterId;
В методе запуска Unity мы создаем инстанс ивента FMOD, а затем получаем описание Event Description для инстанса. Мы используем описаниеEvent Description, чтобы получить описание параметра ивента Parameter Description, вызвав метод getParameterDescriptionByName. Мы сохраняем ID описания параметра в объекте pitchParameterId и запускаем инстанс ивента :
void Start ( )
{
instance = FMODUnity.RuntimeManager.CreateInstance(fmodEvent);
FMOD.Studio.EventDescription pitchEventDescription;
instance.getDescription( out pitchEventDescription);
FMOD.Studio.PARAMETER_DESCRIPTION pitchParameterDescription;
pitchEventDescription.getParameterDescriptionByName( "Pitch" , out pitchParameterDescription);
pitchParameterId = pitchParameterDescription.id;
instance.start();
}
В методе Update мы теперь можем вызвать setParameterByID и передать наш идентификатор параметра (parameter id) и переменную pitch в качестве аргументов (повторите эти действия для остальных параметров):
instance.setParameterByID(pitchParameterId, pitch);
Как использовать глобальные параметры (Global Parameters) в FMOD Studio и Unity?
FMOD Studio также поддерживает Глобальные Параметры (Global Parameters), начиная с версии 2.0. Это означает, что разные ивенты могут иметь одинаковые параметры, и изменения параметров влияют на все инстансы ивентов. Раньше приходилось изменять параметры индивидуально для каждого отдельного ивента. Чтобы активировать глобальный параметр (Global Parameters), мы устанавливаем для параметра Область Действия - Parameter scope - в значение Global в FMOD Studio на этапе создания параметра:
Изменение Глобальных Параметров (Global Parameters) с помощью компонента Global Parameter Trigger в Unity
Компонент Global Studio Parameter Trigger в основном ведет себя как обычный компонент Studio Parameter Trigger. Используйте его, если вы хотите изменять Глобальные Параметры (Global Parameters) без использования кода. Этому компоненту не требуется Studio Event Emitter в качестве целевого объекта (нет опции Target), и вы выбираете нужный параметр (Parameter) непосредственно из раскрывающегося списка:
Управление Глобальными Параметрами (Global Parameters) с помощью кода C# в Unity
Глобальные Параметры (Global Parameters) управляются API системных параметров и имеют одно значение, которое используется всеми инстансами. В коде мы просто меняем параметры напрямую, обращаясь к StudioSystem и вызывая метод setParameterByName:
FMODUnity.RuntimeManager.StudioSystem.setParameterByName( "EQ Global" , eq);
#unity #unity3d #fmod #audioengine #gamedev #sounddesign #саунддизайн