您有一个声明为:
public delegate void PCMReaderCallback(float[] data);
然后你有一个AudioClip.Create
使用这个委托作为参数的 Unity 函数。这是这里唯一要理解的事情。
这是它的样子:
public static AudioClip Create(string name, int lengthSamples, int channels, int frequency, bool stream, PCMReaderCallback pcmreadercallback);
如您所见,它以PCMReaderCallback
上面委托的名称作为参数。
现在,为了使用它,您首先需要创建一个与委托参数匹配的函数。请记住,我们的委托float[]
作为参数并且是void
返回类型。你给这个函数起什么名字并不重要。它应该如下所示:
void OnAudioRead(float[] data)
{
}
最后,要使用该功能:
AudioClip newAudioClip = AudioClip.Create("Pigeon", samplerate * 2, 1, samplerate, true, OnAudioRead);
AudioSource attachedSource = GetComponent<AudioSource>();
attachedSource.clip = newAudioClip;
attachedSource.Play();
如您所见,我们将OnAudioRead
函数传递给参数,该参数将在每次读取数据时PCMReaderCallback pcmreadercallback
调用我们的函数。这是由 Unity 自动调用的。OnAudioRead
AudioClip
我的问题是如何使用已经定义的委托来调用我选择的方法?
让我们PCMReaderCallback
作为一个例子。PCMReaderCallback
在名为 的类中声明AudioClip
。要使用它,您必须使用全名AudioClip.PCMReaderCallback
。
创建一个AudioClip.PCMReaderCallback
作为参数的函数,进行一些数据处理,然后Invoke
在处理完成时调用传入的函数:
void makeAlecAudioFunction(AudioClip.PCMReaderCallback allecCallBack)
{
//Generate some random dummy audio data
float[] dummyData = new float[4000];
for (int i = 0; i < dummyData.Length; i++)
{
dummyData[i] = Random.Range(0f, 1f);
}
//Call the function that was passed in then pass it in the data we generated
allecCallBack.Invoke(dummyData);
}
该功能的用法:
创建一个将在makeAlecAudioFunction
完成数据处理后调用的函数。
void OnAlecAudio(float[] data)
{
for (int i = 0; i < data.Length; i++)
{
Debug.Log("Alec Audio Data: " + data[i]);
}
}
现在,要调用makeAlecAudioFunction
函数,调用它并传入OnAlecAudio
函数。请记住,它们的参数必须匹配!:
makeAlecAudioFunction(OnAlecAudio);
最后,我认为回调函数背后的主要原因是做某事而不让程序的其余部分等待,然后在该操作完成时执行回调。因此,您makeAlecAudioFunction
应该是一个协程函数,或者应该在另一个函数中调用Thread
(在 Unity 中很复杂)。如果使用Thread
,回调必须在 main 中调用Thread
。只是试图保持这个例子简单。