public bool TryPlayMusic(MusicSetup musicSetup, bool queue = true) { if (musicSetup == null || musicSetup == transitioningMusicSetup) { return(false); } if (transitioningMusicSetup != null) { if (queue) { musicQueue.Enqueue(musicSetup); return(true); } } if (nextMusicSource) { transitioningMusicSetup = null; StopAllCoroutines(); StartCoroutine(TransitionMusic(musicSetup)); return(true); } return(false); }
IEnumerator TransitionMusic(MusicSetup nextMusicSetup) { if (nextMusicSetup == null) { yield break; } transitioningMusicSetup = nextMusicSetup; nextMusicSource.Stop(); nextMusicSource.clip = nextMusicSetup.clip; nextMusicSource.loop = nextMusicSetup.loop; switch (nextMusicSetup.transitionMode) { case MusicTransitionMode.Fade: nextMusicSource.volume = 0; nextMusicSource.PlayDelayed(nextMusicSetup.fadeOut); break; case MusicTransitionMode.CrossFade: nextMusicSource.volume = 0; nextMusicSource.Play(); break; case MusicTransitionMode.Wait: if (currentMusicSource) { currentMusicSource.loop = false; } nextMusicSource.volume = nextMusicSetup.volume; break; default: break; } bool finishedTransition = false; while (!finishedTransition) { switch (nextMusicSetup.transitionMode) { case MusicTransitionMode.Fade: if (currentMusicSource && currentMusicSource.volume > 0) { Fade(currentMusicSource, -Mathf.Abs(currentMusicSetup.fadeOut), currentMusicSetup.volume); } else if (nextMusicSource && nextMusicSource.volume < nextMusicSetup.volume) { Fade(nextMusicSource, Mathf.Abs(nextMusicSetup.fadeIn), nextMusicSource.volume); } else { finishedTransition = true; } break; case MusicTransitionMode.CrossFade: if (currentMusicSetup != null) { Fade(currentMusicSource, -Mathf.Abs(currentMusicSetup.fadeOut), currentMusicSetup.volume); } Fade(nextMusicSource, Mathf.Abs(nextMusicSetup.fadeIn), nextMusicSetup.volume); if ((currentMusicSetup == null || !currentMusicSource || currentMusicSource.volume <= 0) && (!nextMusicSource || nextMusicSource.volume >= nextMusicSetup.volume)) { finishedTransition = true; } break; case MusicTransitionMode.Wait: if (!currentMusicSource || !currentMusicSource.isPlaying) { if (nextMusicSource) { nextMusicSource.Play(); } finishedTransition = true; } break; default: break; } yield return(null); //wait a frame } //finished transition so swap the sources var tempSource = currentMusicSource; currentMusicSource = nextMusicSource; nextMusicSource = tempSource; //swap the setups currentMusicSetup = nextMusicSetup; nextMusicSetup = null; //rename sources if (currentMusicSource) { currentMusicSource.gameObject.name = "CurrentMusic"; } if (nextMusicSource) { nextMusicSource.gameObject.name = "NextMusic"; } //stop the old music if (nextMusicSource) { nextMusicSource.Stop(); } transitioningMusicSetup = null; if (musicQueue.Count > 0) { StartCoroutine(TransitionMusic(musicQueue.Dequeue())); } }