Как проигрывать по очереди массив аудио в Unity?
У меня есть достаточно большой массив из 60 треков. Мне необходимо, чтобы они играли по очереди. При смене сцены также прерывался трек и играл следующий по очереди. То есть в одной сцене могут сыграть 0,1,2 элемент. После переключения сцены должен играть 3 и т.д. На просторах интернета нашел функцию, которая вроде бы должна работать так как я и хочу. Но я не совсем понимаю как ее правильно вызвать.
public AudioClip[] clipArray;
public AudioSource effectSource;
private int clipIndex;
void PlayRoundRobin() {
if (clipIndex < clipArray.Length)
{
effectSource.PlayOneShot(clipArray[clipIndex]);
clipIndex++;
}
else
{
clipIndex = 0;
effectSource.PlayOneShot(clipArray[clipIndex]);
clipIndex++;
}
}
Ответы (1 шт):
Автор решения: Psyxoz0x13
→ Ссылка
Попробуй такое решение:
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
public class MusicPlayer : MonoBehaviour
{
[SerializeField] private AudioClip[] _audioClips;
private static int _lastAudioIndex = 0;
private Coroutine _audioPlayCoroutine;
private AudioSource _audioSource;
private void Awake()
{
if (FindObjectsOfType<MusicPlayer>().Length > 1)
{
Destroy(gameObject);
}
_audioSource = GetComponent<AudioSource>();
SceneManager.activeSceneChanged += OnActiveSceneChanged;
DontDestroyOnLoad(gameObject);
}
private void OnDestroy()
{
SceneManager.activeSceneChanged -= OnActiveSceneChanged;
}
private void OnActiveSceneChanged(Scene arg0, Scene arg1)
{
if (_audioPlayCoroutine != null)
{
StopCoroutine(_audioPlayCoroutine);
_lastAudioIndex++;
}
_lastAudioIndex = GetClipIndex();
_audioPlayCoroutine = StartCoroutine(GetAudioPlay());
}
private IEnumerator GetAudioPlay()
{
while (true)
{
var clip = _audioClips[_lastAudioIndex];
_audioSource.clip = clip;
_audioSource.Play();
yield return new WaitForSeconds(clip.length + Time.deltaTime);
_audioSource.Stop();
_lastAudioIndex++;
_lastAudioIndex = GetClipIndex();
}
}
private int GetClipIndex()
{
return _lastAudioIndex % _audioClips.Length;
}
}