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:延迟回调执行的时间], /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], [audio3DMaxDistance:3D音频最大距离]} public override void Play(AudioData audioData) { audioData = AudioDataInitialize(audioData); if (audioData.clip == null) { Debug.LogError("播放的音效音频片段为空"); return; } AudioSource source = audioSourcePool.GetAudioSource("SFX"); if (source == null) return; source.clip = audioData.clip; source.volume = audioData.volume; // 设置2D与3D音频 if (audioData.is3DAudio) { source.transform.position = audioData.audio3DPosition; source.spatialBlend = 1; source.minDistance = 1f; if (audioData.audio3DMaxDistance != 0) { source.maxDistance = audioData.audio3DMaxDistance; } else { // 默认3D最大距离为3米 source.maxDistance = 3f; } } else { source.transform.position = Vector3.zero; source.spatialBlend = 0; source.minDistance = 1f; source.maxDistance = 500f; } source.Play(); // 将 AudioSource 加入活动列表 activeSources.Add(source); // 使用协程处理延迟和回调 CoroutineHelper.Instance.StartCoroutine(PlaySFXCoroutine(source, audioData.delayOnCompleteTime, audioData.onComplete)); } /// /// 停止所有音效 /// /// {[无可使用变量]} public override void Stop() { if (activeSources == null) return; 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); audioSourcePool.ReturnAudioSource("SFX", source.gameObject); onComplete?.Invoke(); activeSources.Remove(source); } } }