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

MonoBehaviour.OnAudioFilterRead(float[], int)

Параметры

data array of floats, содержащий аудиоданные.
channels int, в котором хранится количество каналов аудиоданных, переданных этому делегату..

Описание

Если реализован OnAudioFilterRead, Unity вставит пользовательский фильтр в цепочку аудио DSP.

Фильтр вставляется в том же порядке, в котором скрипт MonoBehaviour отображается в Инспекторе.

OnAudioFilterRead вызывается каждый раз, когда фрагмент аудио отправляется в фильтр (это происходит часто, примерно каждые 20 мс, в зависимости от частоты дискретизации и платформы). Аудиоданные представляют собой массив чисел с плавающей запятой в диапазоне от [-1.0f;1.0f] и содержат аудио из предыдущего фильтра в цепочке или из AudioClip в AudioSource. Если это первый фильтр в цепочке и клип не привязан к источнику звука, этот фильтр будет воспроизводиться как источник звука. Таким образом, вы можете использовать фильтр как аудиоклип, процедурно генерируя звук.

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

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

Также обратите внимание, что OnAudioFilterRead вызывается в потоке, отличном от основного потока (а именно в аудиопотоке), поэтому вызов многих функций Unity из этой функции не разрешен (если вы попытаетесь, во время выполнения появится предупреждение).

Смотрите так же: Audio Filters.

using UnityEngine; // В примере кода показано, как реализовать метроном, который процедурно // генерирует звуки кликов с помощью обратного вызова OnAudioFilterRead. // Пока игра стоит на паузе или приостановлена, это время не будет обновляться и звучит // воспроизведение будет приостановлено. Поэтому у разработчиков программ планирования музыки нет // для любого изменения расписания после возобновления работы приложения [RequireComponent(typeof(AudioSource))] public class AudioTest : MonoBehaviour { public double bpm = 140.0F; public float gain = 0.5F; public int signatureHi = 4; public int signatureLo = 4; private double nextTick = 0.0F; private float amp = 0.0F; private float phase = 0.0F; private double sampleRate = 0.0F; private int accent; private bool running = false; void Start() { accent = signatureHi; double startTick = AudioSettings.dspTime; sampleRate = AudioSettings.outputSampleRate; nextTick = startTick * sampleRate; running = true; } void OnAudioFilterRead(float[] data, int channels) { if (!running) return; double samplesPerTick = sampleRate * 60.0F / bpm * 4.0F / signatureLo; double sample = AudioSettings.dspTime * sampleRate; int dataLen = data.Length / channels; int n = 0; while (n < dataLen) { float x = gain * amp * Mathf.Sin(phase); int i = 0; while (i < channels) { data[n * channels + i] += x; i++; } while (sample + n >= nextTick) { nextTick += samplesPerTick; amp = 1.0F; if (++accent > signatureHi) { accent = 1; amp *= 2.0F; } Debug.Log("Tick: " + accent + "/" + signatureHi); } phase += amp * 0.3F; amp *= 0.993F; n++; } } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3