вы не слишком далеко, но это не так, как работает сопрограмма - вам нужно быть в окружении сопрограммы, чтобы иметь возможность ждать, вот как вы это делаете
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 отслеживает выполнение сопрограмм, и до следующего кадра вернет управление туда, где вы оставили свою сопрограмму.
Это довольно умно, так как значительно облегчает распространение вещей во времени.