Пример #1
0
    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);
    }
Пример #2
0
    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()));
        }
    }