结合使用OnAudioFilterRead和playOnAwake

Anokta

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

基本上,使用OnAudioFilterRead上的回调函数的AudioSourceplayOnAwake标志的检验在一个意想不到的行为结果,即默认统一的AudioSource流似乎获得出场的一对夫妇缓冲区-绕过OnAudioFilterRead功能-直到脚本执行正确初始化(assumably直到完成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,这似乎很好用。同样,删除耗时的代码块可以完全解决预期的问题。

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

Anokta

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章