Unity 6.3
0 онлайн 63 гостей 3 в системе
Вход

GeneratorInstance

структура в UnityEngine.Audio

Выполнено в:UnityEngine.AudioModule

Описание

ProcessorInstance, который генерирует аудиоданные.

GeneratorInstance могут быть определены путем реализации интерфейсов GeneratorInstance.IControl_1 и IRealtime, которые определяют поведение потока управления и реального времени соответственно.

Для использования генератора в сцене, например, с AudioSource, он должен иметь ассоциированный IAudioGenerator, который будет инстанционировать его. В звуковой системе Unity они используются с AudioSource путем установки свойства AudioSource.generator на ассоциированное IAudioGenerator.

Также можно создать собственные генераторы с помощью кода, используя ControlContext. Взаимодействие с инстанционированным генератором зависит от владельца GeneratorInstance: Если генератор был создан из AudioSource, вы будете взаимодействовать с ним через экземпляр, полученный из AudioSource.generatorInstance.

using Unity.Burst;
using Unity.IntegerTime;
using UnityEngine;
using UnityEngine.Audio;
using static UnityEngine.Audio.ProcessorInstance;

[BurstCompile(CompileSynchronously = true)] public struct SineProcessor : GeneratorInstance.IRealtime { private const float k_Tau = Mathf.PI * 2; private float m_Frequency; private float m_Phase;

public static GeneratorInstance Allocate(ControlContext context, float frequency) { return context.AllocateGenerator(new SineProcessor(frequency), new Control()); }

public bool isFinite => false; public bool isRealtime => true; public DiscreteTime? length => null;

private GeneratorInstance.Setup m_Setup;

SineProcessor(float initialFrequency) { m_Frequency = initialFrequency; m_Phase = 0.0f; m_Setup = new GeneratorInstance.Setup(); }

public void Update(UpdatedDataContext context, Pipe pipe) { foreach (var data in pipe.GetAvailableData(context)) { if (data.TryGetData(out FrequencyData freq)) { m_Frequency = freq.Value; } } }

public GeneratorInstance.Result Process(in RealtimeContext ctx, Pipe pipe, ChannelBuffer buffer, GeneratorInstance.Arguments args) { for (var frame = 0; frame < buffer.frameCount; frame++) { for (var channel = 0; channel < buffer.channelCount; channel++) buffer[channel, frame] = Mathf.Sin(m_Phase * k_Tau);

m_Phase += m_Frequency / m_Setup.sampleRate;

if (m_Phase > 1.0f) m_Phase -= 1.0f; }

return buffer.frameCount; }

struct Control : GeneratorInstance.IControl<SineProcessor> { public void Configure(ControlContext context, ref SineProcessor generator, in AudioFormat format, out GeneratorInstance.Setup setup, ref GeneratorInstance.Properties p) { generator.m_Setup = new GeneratorInstance.Setup(speakerMode: AudioSpeakerMode.Mono, sampleRate: format.sampleRate); setup = generator.m_Setup; }

public void Dispose(ControlContext context, ref SineProcessor processor) { }

public void Update(ControlContext context, Pipe pipe) { }

public ProcessorInstance.Response OnMessage(ControlContext context, Pipe pipe, Message message) { return ProcessorInstance.Response.Unhandled; } }

public struct FrequencyData { public readonly float Value; public FrequencyData(float value) { Value = value; } } }

Открытые методы

Метод Описание
EqualsПроверяет, равен ли этот экземпляр другому.
GetHashCodeПолучает хэш-код, основанный на этом экземпляре.

Операторы

Оператор Описание
оператор!=Проверяет, не равны ли два экземпляра.
оператор ==Проверяет, равны ли два экземпляра.
ProcessorInstanceПреобразуйте это GeneratorInstance в его более общее представление ProcessorInstance.