using System.Collections; using UnityEngine; namespace Stary.Evo.AudioCore { public class MusicPlayer : AbstractAudio { private AudioSourcePool audioSourcePool; private AudioSource audioSource1; private AudioSource audioSource2; private AudioSource currentAudioSource; public MusicPlayer(AudioSourcePool audioSourcePool) { this.audioSourcePool = audioSourcePool; } /// /// 播放背景音乐 /// /// {[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]} public override void Play(AudioData audioData) { audioData = AudioDataInitialize(audioData); if (audioSource1 == null) { audioSource1 = audioSourcePool.GetAudioSource("Music"); audioSource1.clip = audioData.clip; audioSource1.volume = audioData.volume; currentAudioSource = audioSource1; currentAudioSource.Play(); CoroutineHelper.StartCoroutine(FadeMusic(audioSource1, audioData.fadeDuration, audioSource2)); } else { if (audioSource2 == null) { audioSource2 = audioSourcePool.GetAudioSource("Music"); audioSource2.clip = audioData.clip; audioSource2.volume = audioData.volume; currentAudioSource = audioSource2; currentAudioSource.Play(); CoroutineHelper.StartCoroutine(FadeMusic(audioSource2, audioData.fadeDuration, audioSource1)); } else { Debug.LogWarning("已同时存在两个背景乐在切换"); } } } /// /// 关闭背景音乐 /// /// {[fadeDuration:自然过渡时间]} public override void Stop(AudioData audioData) { audioData = AudioDataInitialize(audioData); CoroutineHelper.StartCoroutine(FadeOutMusic(currentAudioSource, audioData.fadeDuration)); } /// /// 切换音频 /// /// 播放的音频 /// 变化时间 /// 停止的音频 /// private IEnumerator FadeMusic(AudioSource source1, float fadeDuration, AudioSource source2 = null) { yield return FadeInMusic(source1, fadeDuration); if (source2 != null) { yield return FadeOutMusic(source2, fadeDuration); } } /// /// 关闭音频的协程 /// /// /// /// private IEnumerator FadeOutMusic(AudioSource source, float fadeDuration) { float startVolume = source.volume; while (source.volume > 0) { source.volume -= startVolume * Time.deltaTime / fadeDuration; yield return null; } source.Stop(); audioSourcePool.ReturnAudioSource("Music", source.gameObject); if (currentAudioSource == audioSource1) { audioSource2 = null; } else if (currentAudioSource == audioSource2) { audioSource1 = null; } } /// /// 开启音频的协程 /// /// /// /// private IEnumerator FadeInMusic(AudioSource source, float fadeDuration) { float targetVolume = source.volume; source.volume = 0; while (source.volume < targetVolume) { source.volume += targetVolume * Time.deltaTime / fadeDuration; yield return null; } } } }