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

基本上,在选中OnAudioFilterRead标志时在AudioSource上使用playOnAwake回调函数会导致意外行为,即,默认的Unity AudioSource流似乎会为几个缓冲区播放-绕过OnAudioFilterRead函数-直到脚本正确初始化(大概是直到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中的代码块完成后才开始提供静默输出(它播放剪辑时就好像没有脚本在此之前一样)。

我已经尝试过,以更好地了解潜在问题,甚至得到更奇怪的结果。首先,将Stop预先添加到Awake似乎没有任何影响:
  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函数上耗时的代码块移至OnEnable也无济于事。

我唯一能找到的解决方法是将ScriptExecutionOrder更改为在MuteSource之前调用MuteListener,这似乎很好用。同样,删除耗时的代码块可以完全解决此问题。

总而言之,如果您对此有任何建议/反馈,我非常感谢。首先十分感谢!

最佳答案

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

关于c# - 结合使用OnAudioFilterRead和playOnAwake,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30654493/

10-10 03:37