AudioSource.Play() 是异步函数吗?

Is AudioSource.Play() async a function?

预期

  1. 首先,积木发出声音。
  2. 然后,砖块消失了。

代码

public class Brick : MonoBehaviour
{
    private AudioSource _audio;

    public void Awake()
    {
        _audio = GetComponent<AudioSource>();
    }

    public void OnCollisionEnter2D()
    {
        _audio.Play();
        Destroy(gameObject);
    }
}

结果

Brick 没有发出声音,Brick 消失了。 我想知道为什么 Brick 没有声音。

猜猜

reference 并没有说它是异步的,但是,AudioSource.Play() 是异步函数吗?

附录

当然,攻击 c#Brick.cs 的 gameObject 具有有效的 AudioSource。 因此,当我像这样在 Start() 处编写代码时,Brick 会正确地发出声音。

public void Start()
{
    _audio.Play();
}

是的,它是异步的。如果它不是异步的,那么在播放音效之前,您的整个游戏都会卡住。解决问题的一种方法是让一个 GameObject 专用于 AudioSource,然后使用 AudioSource.PlayOneShot 播放所有音效。

另一种选择是在播放音频后销毁 Brick。您可能应该 remove/disable SpriteRenderer 和碰撞器,这样块就不会可见。 Destroy有第二个参数,是对象被销毁前的延时。

第二个选项的示例代码:

_audio.Play();
GetComponent<Collider2D>().enabled = false;
GetComponent<Renderer>().enabled = false;
Destroy(gameObject, _audio.clip.length);