如何统一播放音频
Posted
技术标签:
【中文标题】如何统一播放音频【英文标题】:How to play the audio one by one in unity 【发布时间】:2019-05-23 17:07:38 【问题描述】:我想在 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】:你离得不远,但这不是协程的工作方式——你需要在协程中才能等待,这就是你的做法
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
如果你观察会发生什么:随着每个协程启动,控制进入协程,直到第一个 yield 返回。此时我们将指令指针倒回到 Start(),并启动第二个协程。然后 Start() 完成,绘制框架。 Unity 会跟踪正在运行的协程,并在下一帧之前将控制权返回到您离开协程的位置。
它非常聪明,因为它使及时传播事物变得更加容易。
【讨论】:
谢谢!有用。这是否意味着当我想等待一项任务完成然后执行下一项时,我需要在 IEnumerator 函数内等待?以上是关于如何统一播放音频的主要内容,如果未能解决你的问题,请参考以下文章
当另一个应用开始播放音频时,如何自动暂停我的应用中的音频播放器?