AudioSource.Play() 是异步函数吗?
Is AudioSource.Play() async a function?
预期
- 首先,积木发出声音。
- 然后,砖块消失了。
代码
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);
预期
- 首先,积木发出声音。
- 然后,砖块消失了。
代码
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);