Как проигрывать аудио по одному в единстве - PullRequest
0 голосов
/ 23 мая 2019

Я хочу добиться того, чтобы музыка поочередно звучала в 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 голосов
/ 23 мая 2019

вы не слишком далеко, но это не так, как работает сопрограмма - вам нужно быть в окружении сопрограммы, чтобы иметь возможность ждать, вот как вы это делаете

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 отслеживает выполнение сопрограмм, и до следующего кадра вернет управление туда, где вы оставили свою сопрограмму.

Это довольно умно, так как значительно облегчает распространение вещей во времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...