如何统一播放音频

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 函数内等待?

以上是关于如何统一播放音频的主要内容,如果未能解决你的问题,请参考以下文章

理解Android音频焦点

当另一个应用开始播放音频时,如何自动暂停我的应用中的音频播放器?

如何以统一的方式重放声音?

如果选择了一个播放器,如何停止所有音频播放器的播放?

在IOS核心音频中,如何找到文件播放器音频单元的真实当前播放头位置?

从 url 下载时如何播放音频?