using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Stary.Evo.AudioCore { public class SFXPlayer : AbstractAudio { private AudioSourcePool audioSourcePool; private List activeSources = new List(); // 正在播放的 AudioSource 列表 public SFXPlayer(AudioSourcePool audioSourcePool) { this.audioSourcePool = audioSourcePool; } /// /// 播放音效 /// /// {[clip:音频], [volume:音量], /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} public override void Play(AudioData audioData) { AudioSource source = audioSourcePool.GetAudioSource("SFX"); if (source == null) return; source.clip = audioData.clip; source.volume = audioData.volume; source.Play(); // 将 AudioSource 加入活动列表 activeSources.Add(source); // 使用协程处理延迟和回调 CoroutineHelper.StartCoroutine(PlaySFXCoroutine(source, audioData.delayOnCompleteTime, audioData.onComplete)); } /// /// 停止所有音效 /// /// {[无可使用变量]} public override void Stop(AudioData audioData) { foreach (var source in activeSources) { if (source.isPlaying) { source.Stop(); audioSourcePool.ReturnAudioSource("SFX", source.gameObject); } } activeSources.Clear(); } /// /// 播放音效的协程 /// /// /// /// /// private IEnumerator PlaySFXCoroutine(AudioSource source, float delay, System.Action onComplete) { yield return new WaitForSeconds(source.clip.length + delay); onComplete?.Invoke(); audioSourcePool.ReturnAudioSource("SFX", source.gameObject); activeSources.Remove(source); } } }