将 OnAudioFilterRead 与 playOnAwake 结合使用

Using OnAudioFilterRead with playOnAwake

我目前正在 Unity 中编写一些音频处理代码,最近遇到了一个相当奇怪的问题,希望能尽快解决。

基本上使用OnAudioFilterRead callback function on an AudioSource when the playOnAwake flag is checked results in an unexpected behavior, i.e., the default Unity AudioSource stream seems to get played for a couple of buffers - bypassing OnAudioFilterRead function - until the script is initialized properly (assumably until Awake/OnEnable个函数就搞定了。

为了强调这个问题,这里有一个使音频源静音的简单说明性脚本:

// This script is attached to a GameObject with an AudioSource.
// AudioSource has a clip attached to it, and playOnAwake flag is set to true.
[RequireComponent(typeof(AudioSource))] 
public class MuteSource : MonoBehaviour {
  void Awake () {
    /*
     *  Some time-consuming code block.
     */
  }

  void OnAudioFilterRead (float[] data, int channels) {
    for (int i = 0; i < data.Length; ++i) {
      data[i] = 0.0f;
    }
  }
}

如前所述,上面的脚本仅在 Awake 中的代码块完成后才开始提供静默输出(它播放剪辑,就好像在此之前没有附加脚本一样)。

我一直在研究这个问题,以便更好地了解潜在的问题,甚至得到了奇怪的结果。首先,在 Awake 中预先添加 Stop 似乎没有任何影响:

  void Awake () {
    // The clip still plays as normal after this call.
    AudioSource audioSource = GetComponent<AudioSource>();
    audioSource.Stop();

    /*
     *  Some time-consuming code block.
     */
  }

我尝试的另一件事是通过在 AudioListener 上附加一个类似的脚本来强制静音输出,但仍然没有成功:

// This script is attached to a GameObject with AudioListener.
[RequireComponent(typeof(AudioListener))] 
public class MuteListener : MonoBehaviour {
  void Awake () {
  }

  void OnAudioFilterRead (float[] data, int channels) {
    for (int i = 0; i < data.Length; ++i) {
      data[i] = 0.0f;
    }
  }
}

合并后,如果场景中同时存在 MuteSource 和 MuteListener,即使 MuteListener 似乎也不足以强制静音输出,即问题仍然存在。事实上,我尝试了不同的变体,例如完全从 AudioSource 中删除 OnAudioFilterRead 并如下所述将 Stop 添加到 MuteSource 的 Awake 中,这并没有改变行为。同样,将 耗时的代码块 on Awake 函数移动到 OnEnable 也无济于事。

我能找到的唯一解决方法是更改​​ ScriptExecutionOrder 以在 MuteSource 之前调用 MuteListener,这似乎工作正常。同样,删除 耗时的代码块 完全解决了预期的问题。

总而言之,如果您对此有任何意见,我将不胜感激 suggestions/feedback。非常感谢!

以防其他人遇到该问题,似乎该问题已在 Unity 5.2.0B5(或可能是 5.1.0 以上的早期版本)中自动解决。奇怪的是,我在他们的任何发行说明中都找不到任何关于修复的具体信息。