Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

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

Встроенное панорамирование аудиоисточников — это простая форма пространственной обработки. Он берет источник и регулирует усиление вклада левого и правого уха в зависимости от расстояния и угла между компонентом Audio ListenerA. который действует как микрофон, получая звук от источников звука в сцене и выводя его на динамики компьютера. Подробнее
См. в Словарь
и источник звука. Это обеспечивает простые ориентиры для игрока в горизонтальной плоскости.

SDK Unity Audio Spatializer и пример реализации

Для обеспечения гибкости и поддержки работы с пространственным воспроизведением звука в Unity есть открытый интерфейс Audio Spatializer SDK, являющийся расширением поверх Native Audio Plugin SDK. Вы можете заменить стандартное средство панорамирования в Unity более продвинутым и предоставить ему доступ к важным метаданным об источнике и прослушивателе, необходимым для вычислений.

Пример собственного плагина пространственного звука см. в SDK плагина Native Audio для Unity. Плагин поддерживает только прямую передаточную функцию головы (HRTF) и предназначен только для примера.

Вы можете использовать простую реверберацию, включенную в подключаемый модуль, для маршрутизации аудиоданных из подключаемого модуля пространственного модуля в подключаемый модуль реверберации. Фильтрация HRTF основана на модифицированной версии набора данных KEMAR. Для получения дополнительной информации о наборе данных KEMAR см. документацию и файлы измерений MIT Media Lab.

Если вы хотите изучить набор данных, полученных от человека, см. наборы данных IRCAM. .

Инициализация Unity Audio Spatializer

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

Чтобы разрешить плагину работать как пространственному модулю, вам необходимо установить флаг в битовом поле описания эффекта:

definition.flags |= UnityAudioEffectDefinitionFlags_IsSpatializer;

Если установить флаг UnityAudioEffectDefinitionFlags_IsSpatializer, Unity распознает подключаемый модуль как пространственный модуль на этапе сканирования подключаемого модуля. Когда Unity создает экземпляр плагина, он выделяет структуру UnityAudioSpatializerData для члена spatializerdata Структура UnityAudioEffectState.

Чтобы использовать пространственный преобразователь в проекте, выберите его в настройках проекта (меню: Правка > Настройки проекта > Аудио):

Выбор плагина Spatializer
Выбор плагина Spatializer

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

Флажок Spatializer на источнике звука
Флажок Spatializer на источнике звука

Вы также можете включить пространственный анализатор для аудиоисточника с помощью скрипта C#, используя свойство AudioSource.spatialize.

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

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

definition.flags |= UnityAudioEffectDefinitionFlags_NeedsSpatializerData;

Если подключаемый модуль инициализируется с флагом UnityAudioEffectDefinitionFlags_NeedsSpatializerData, подключаемый модуль получает структуру UnityAudioSpatializerData, но только listenermatrix допустимо. Дополнительные сведения о UnityAudioSpatializerData см. в разделе метаданные эффекта Spatializer.

Чтобы запретить Unity применять затухание расстояния от имени подключаемого модуля пространственного модуля, используйте следующий флаг:

definition.flags |= UnityAudioEffectDefinitionFlags_AppliesDistanceAttenuation;

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

Метаданные эффекта Spatializer

В отличие от других аудиоэффектов Unityлюбой эффект, который может изменить вывод компонентов Audio Mixer, например фильтрация частотных диапазонов звук или применение реверберации. Подробнее
Посмотрите в Словаре
, которые работают со смесью звуков, Unity применяет пространственные эффекты сразу после Audio Source декодирует аудиоданные. Каждый экземпляр пространственного эффекта имеет собственный экземпляр UnityAudioSpatializerData, в основном связанный с данными об источнике звука.

struct UnityAudioSpatializerData { float listenermatrix[16]; // Matrix that transforms sourcepos into the local space of the listener float sourcematrix[16]; // Transform matrix of the Audio Source float spatialblend; // Distance-controlled spatial blend float reverbzonemix; // Reverb zone mix level parameter (and curve) on // the Audio Source float spread; // Spread parameter of the Audio Source (0..360 degrees) float stereopan; // Stereo panning parameter of the Audio Source (-1: fully left, 1: fully right) // The spatializer plugin may override the distance attenuation to // influence the voice prioritization (leave this callback as NULL // to use the built-in Audio Source attenuation curve) UnityAudioEffect_DistanceAttenuationCallback distanceattenuationcallback; float minDistance; // The minimum distance of the Audio Source. // This value may be useful for determining when to apply near-field effects. float maxDistance; // The maximum distance of the Audio Source, or the // distance where the audio becomes inaudible to the listener. };

Структура содержит поля, соответствующие свойствам компонента Audio Source в Инспекторе: Spatial Blend, Reverb Zone Mix, Spread, Стерео панорамирование, Минимальное расстояние и Максимальное расстояние.

Структура UnityAudioSpatializerData содержит полные матрицы преобразования 4x4 для прослушивателя аудио и источника аудио. Матрица слушателя инвертирована, так что вы можете перемножить две матрицы, чтобы получить относительный вектор направления. Матрица слушателей всегда ортонормирована, поэтому можно быстро вычислить обратную матрицу.

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

Соглашения о матрицах

Поле sourcematrix содержит копию матрицы преобразования источника звука. Для источника звука по умолчанию в GameObjectосновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки , и более. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
Посмотрите в Словарь
, который не вращается, матрица представляет собой матрицу перевода, где позиция кодируется в элементах 12, 13 и 14.

Поле listenermatrix содержит обратную матрицу преобразования AudioListener.

Можно определить вектор направления от AudioListener к источнику звука, как показано ниже, где L — это матрица слушателя, а S — это матрица источника. :

float dir_x = L[0] * S[12] + L[4] * S[13] + L[ 8] * S[14] + L[12]; float dir_y = L[1] * S[12] + L[5] * S[13] + L[ 9] * S[14] + L[13]; float dir_z = L[2] * S[12] + L[6] * S[13] + L[10] * S[14] + L[14];

Положение в (L[12], L[13], L[14]) на самом деле является отрицательным значением того, что вы видите в окне инспектора Unity для камерыКомпонент, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
См. в матрице Словарь
. Если бы камера также была повернута, вам также пришлось бы сначала отменить эффект вращения. Чтобы инвертировать матрицу преобразования-вращения, транспонируйте матрицу вращения 3x3 в верхнем левом углу L и вычислите позиции, как показано ниже:

float listenerpos_x = -(L[0] * L[12] + L[ 1] * L[13] + L[ 2] * L[14]); float listenerpos_y = -(L[4] * L[12] + L[ 5] * L[13] + L[ 6] * L[14]); float listenerpos_z = -(L[8] * L[12] + L[ 9] * L[13] + L[10] * L[14]);

Пример кода плагина Audio Spatializer см. в строке 215 в Файл Plugin_Spatializer.cpp.

Кривые затухания и слышимость

Если вы не укажете флаг UnityAudioEffectDefinitionFlags_AppliesDistanceAttenuation, как указано в разделе Инициализация Unity Audio Spatializer, аудиосистема Unity по-прежнему контролирует затухание расстояния. Unity применяет затухание на расстоянии к звуку до того, как он войдет в стадию пространственной обработки, и позволяет аудиосистеме узнать приблизительную слышимость источника. Аудиосистема использует приблизительную слышимость для динамической виртуализации звуков в зависимости от важности, чтобы соответствовать установленному пользователем пределу Max Real Voices.

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

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

typedef UNITY_AUDIODSP_RESULT (UNITY_AUDIODSP_CALLBACK* UnityAudioEffect_DistanceAttenuationCallback)( UnityAudioEffectState* state, float distanceIn, float attenuationIn, float* attenuationOut);

Вы также можете использовать простую пользовательскую логарифмическую кривую, как показано ниже:

UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK SimpleLogAttenuation( UnityAudioEffectState* state, float distanceIn, float attenuationIn, float* attenuationOut) { const float rollOffScale = 1.0f; // Similar to the one in the Audio Project Settings *attenuationOut = 1.0f / max(1.0f, rollOffScale * distanceIn); return UNITY_AUDIODSP_OK; }

Использование скриптов C# из API Unity

В Audio Source есть два метода, которые позволяют задавать и получать параметры эффекта пространственного эффекта: SetSpatializerFloat и GetSpatializerFloat. Эти методы работают аналогично методам SetFloatParameter и GetFloatParameter в общем интерфейсе нативного аудиоплагина. Однако SetSpatializerFloat и GetSpatializerFloat используют индекс параметра, который они должны установить или прочитать, а SetFloatParameter и GetFloatParameter относятся к параметрам по имени.

Логическое свойство AudioSource.spatializer связано с параметром Spatialize в окне инспектора Unity для источника звука. Свойство управляет тем, как Unity создает и освобождает эффект пространственного эффекта, в зависимости от выбранного подключаемого модуля в ваших настройках проекташирокий набор настроек. которые позволяют вам настроить поведение физики, аудио, сети, графики, ввода и многих других областей вашего проекта. Подробнее
См. в Словарь
.

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

Известные ограничения примера подключаемого модуля

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

Код также не поддерживает наклон головы слушателя, независимо от того, прикреплен ли слушатель непосредственно к персонажу игрока или к камере, расположенной в другом месте.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3