如何统一播放音频

时间:2019-05-23 17:07:38

标签: c# unity3d audio

我想实现在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;
        }
    }

}

但是,音乐将同时播放。请帮忙!

1 个答案:

答案 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会跟踪运行的协程,并且在下一帧将控制权返回到协程中的位置之前。

它非常聪明,因为它使及时分发内容变得更加容易。

相关问题