using System; using System.Collections; using System.Collections.Generic; using System.Threading; using Cysharp.Threading.Tasks; using UnityEngine; namespace Stary.Evo.AudioCore { /// /// Audio数据 /// public struct AudioData { /// /// 延迟播放时间 /// public float delayTime; /// /// 资源包名 /// public string packageName; /// /// 资源名 /// public string assetName; /// /// 音频 /// public AudioClip clip; /// /// 音量 /// public float volume; /// /// 回调行为 /// public System.Action onComplete; /// /// 延迟回调执行的时间 /// public float delayOnCompleteTime; /// /// 自然过渡时间 /// public float fadeDuration; /// /// 是否不打断上一段对话 /// public bool isNotOverVoice; /// /// 是否是3D音频 /// public bool is3DAudio; /// /// 3D声音位置 /// public Vector3 audio3DPosition; /// /// 3D声音最大距离 /// public float audio3DMaxDistance; } public interface IAudio { IResources Resources { get; set; } AudioSourcePool AudioSourcePool { get; set; } AudioData Initialize(AudioData audioData); void Play(AudioData audioData); UniTask PlayAsync(AudioData audioData); UniTask FadeInMusic(AudioSource source, float fadeDuration); UniTask FadeOutMusic(AudioSource source, float fadeDuration); void Stop(); void StopAll(); } public abstract class AbstractAudio : IAudio { public IResources Resources { get; set; } public AudioSourcePool AudioSourcePool { get; set; } public abstract void Play(AudioData audioData); public abstract UniTask PlayAsync(AudioData audioData); public abstract void StopAll(); public virtual void Stop() { } protected AbstractAudio(IResources resources) { Resources = resources; if (!GetType().Name.Contains("Music")) { AudioSourcePool = new AudioSourcePool(GetType().Name, -1); AudioSourcePool.Creation(); } } /// /// 音频数据初始化 /// /// /// public virtual AudioData Initialize(AudioData audioData) { if (audioData.volume == 0) { audioData.volume = 1f; } if (audioData.fadeDuration == 0) { audioData.fadeDuration = 1f; } return audioData; } /// /// 音频淡入 /// /// /// /// public async UniTask FadeInMusic(AudioSource source, float fadeDuration) { float targetVolume = source.volume; source.volume = 0; while (source.volume < targetVolume) { source.volume += targetVolume * Time.deltaTime / fadeDuration; await UniTask.Yield(); } } /// /// 音频淡出 /// /// /// /// public async UniTask FadeOutMusic(AudioSource source, float fadeDuration) { if (source != null) { float startVolume = source.volume; while (source.volume > 0) { source.volume -= startVolume * Time.deltaTime / fadeDuration; await UniTask.Yield(); } source.Stop(); } } /// /// 播放音效的协程 /// /// /// /// /// public async UniTask PlayAudioAWait(AudioSourceToken audioSourceToken, float delay, System.Action onComplete) { await PlayAudioAWait(audioSourceToken, delay); onComplete?.Invoke(); } /// /// 播放音效的协程 /// /// /// /// /// public async UniTask PlayAudioAWait(AudioSourceToken audioSourceToken, float delay) { Debug.Log($"PlayAudioAWait:{GetType().Name}"); if (!GetType().Name.Contains("Voice")) { await UniTask.Delay(TimeSpan.FromSeconds(audioSourceToken.source.clip.length - 2f), cancellationToken: audioSourceToken.cancellationToken.Token); await FadeOutMusic(audioSourceToken.source, 2f); await UniTask.Delay(TimeSpan.FromSeconds(delay), cancellationToken: audioSourceToken.cancellationToken.Token); } else { await UniTask.Delay(TimeSpan.FromSeconds(audioSourceToken.source.clip.length + delay), cancellationToken: audioSourceToken.cancellationToken.Token); } AudioSourcePool.RecycleSpawn(audioSourceToken); } } }