using System.Collections; using UnityEngine; namespace Stary.Evo.AudioCore { public class VoicePlayer : AbstractAudio { private AudioSourcePool audioSourcePool; private AudioSource currentSource; private Coroutine myCoroutine; public VoicePlayer(AudioSourcePool audioSourcePool) { this.audioSourcePool = audioSourcePool; } /// /// 播放语音 /// /// {[clip:音频], [volume:音量], /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} public override void Play(AudioData audioData) { // 停止当前正在播放的语音与旧协程 Stop(new AudioData { }); audioData = AudioDataInitialize(audioData); if (myCoroutine != null) { CoroutineHelper.StopCoroutine(myCoroutine); myCoroutine = null; } currentSource = audioSourcePool.GetAudioSource("Voice"); if (currentSource == null) return; currentSource.clip = audioData.clip; currentSource.volume = audioData.volume; currentSource.Play(); // 使用协程处理延迟和回调 myCoroutine = CoroutineHelper.StartCoroutine(PlayVoiceCoroutine(currentSource, audioData.delayOnCompleteTime, audioData.onComplete)); } /// /// 停止语音 /// /// /// {[无可使用变量]} public override void Stop(AudioData audioData) { if (currentSource != null && currentSource.isPlaying) { currentSource.Stop(); audioSourcePool.ReturnAudioSource("Voice", currentSource.gameObject); currentSource = null; if (myCoroutine != null) { CoroutineHelper.StopCoroutine(myCoroutine); myCoroutine = null; } } } /// /// 播放语音的协程 /// /// /// /// /// private IEnumerator PlayVoiceCoroutine(AudioSource source, float delayOnComplete, System.Action onComplete) { yield return new WaitForSeconds(source.clip.length + delayOnComplete); audioSourcePool.ReturnAudioSource("Voice", source.gameObject); onComplete?.Invoke(); currentSource = null; myCoroutine = null; } } }