Using OnAudioFilterRead with playOnAwake

本文关键字:playOnAwake with OnAudioFilterRead Using | 更新日期: 2023-09-27 17:53:21

我目前正在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代码块完成后才开始提供无声输出(在此之前,它播放剪辑,就好像没有附加脚本一样)。

为了更好地了解潜在的问题,我已经玩弄了这个,甚至得到了奇怪的结果。首先,在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和添加停止唤醒MuteSource如下所述,这并没有改变行为。同样,将Awake函数上耗时的代码块移到OnEnable也没有帮助。

我能找到的唯一解决办法是改变ScriptExecutionOrder,在MuteSource之前调用MuteListener,这似乎工作得很好。类似地,删除耗时的代码块可以完全解决问题。

总而言之,如果你对此有任何建议/反馈,我真的很感激。非常感谢提前!

Using OnAudioFilterRead with playOnAwake

如果有人遇到这个问题,似乎这个问题在Unity 5.2.0B5中自动解决了(或者可能是5.1.0以上的一些更早的版本)。奇怪的是,我在他们的发行说明中找不到任何关于修复的具体内容。