我想实现在Unity中一对一播放音乐。我试图创建一个audioClip数组,并希望一个接一个地播放它们。而且我还尝试使用StartCoroutine等待一首歌结束,然后播放下一首。
我试图创建一个audioClip数组,并想要一个一个地播放。而且我还尝试使用StartCoroutine等待一首歌结束,然后播放下一首。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
[RequireComponent(typeof(AudioSource))]
public class AudioManager : MonoBehaviour {
public AudioClip[] _audioClips;
private AudioSource _audioSource;
void Awake(){
_audioSource = GetComponent<AudioSource>();
}
// Use this for initialization
void Start () {
for (int i = 0; i < _audioClips.Length;i++){
_audioSource.PlayOneShot(_audioClips[i]);
StartCoroutine("WaitForMusicEnd");
}
}
IEnumerator WaitForMusicEnd()
{
while (_audioSource.isPlaying)
{
yield return null;
}
}
}
但是,音乐将同时播放。请帮忙!
答案 0 :(得分:0)
您距离还不太远,但这不是协程的工作方式-您需要插入协程才能等待,这是您的操作方式
void Start ()
{
StartCoroutine(PlayMusic());
}
IEnumerator PlayMusic()
{
for (int i = 0; i < _audioClips.Length;i++)
{
_audioSource.PlayOneShot(_audioClips[i]);
while (_audioSource.isPlaying)
yield return null;
}
}
控制流程如下:
void Start()
{
StartCoroutine(Foo());
StartCoroutine(Bar());
}
IEnumerator Foo()
{
Debug.Log("FOO");
yield return null;
Debug.Log("foo");
}
IEnumerator Bar()
{
Debug.Log("BAR");
yield return null;
Debug.Log("bar");
}
// FOO
// BAR
// foo
// bar
如果您看到发生了什么:每次启动协程时,控件都会进入协程,直到第一个收益率返回。此时,我们将指令指针回退到Start(),并启动第二个协程。然后Start()完成,绘制框架。 Unity会跟踪运行的协程,并且在下一帧将控制权返回到协程中的位置之前。
它非常聪明,因为它使及时分发内容变得更加容易。