diff --git a/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs b/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs index 0c10290..574df9a 100644 --- a/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs +++ b/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Collections.Generic; +using System.Threading; using UnityEngine; namespace Stary.Evo.AudioCore @@ -58,6 +59,11 @@ namespace Stary.Evo.AudioCore /// 3D声音最大距离 /// public float audio3DMaxDistance; + + /// + /// 异步取消令牌 + /// + public CancellationToken cancellationToken; } public interface IAudio diff --git a/Assets/04.AudioCore/RunTime/Base/AudioSourcePool.cs b/Assets/04.AudioCore/RunTime/Base/AudioSourcePool.cs index 76b0542..293698c 100644 --- a/Assets/04.AudioCore/RunTime/Base/AudioSourcePool.cs +++ b/Assets/04.AudioCore/RunTime/Base/AudioSourcePool.cs @@ -1,10 +1,11 @@ -using UnityEngine; +using System; +using UnityEngine; using System.Collections.Generic; using UnityEngine.SceneManagement; namespace Stary.Evo.AudioCore { - public class AudioSourcePool + public class AudioSourcePool: IDisposable { private Dictionary> poolDict = new Dictionary>(); private GameObject poolObject; @@ -22,9 +23,8 @@ namespace Stary.Evo.AudioCore // 如果不存在,创建一个新对象 poolObject = new GameObject("AudioSourcePool"); } - CoroutineHelper.SetRunner(); - // 初始化 Voice 池(初始 1 个,可动态扩展) + // 初始化 Voice 池(只有 1 个) poolDict["Voice"] = new Queue(); CreateAudioSource("Voice"); @@ -35,7 +35,7 @@ namespace Stary.Evo.AudioCore CreateAudioSource("Music"); } - // 初始化 SFX 池(初始 4 个,可动态扩展) + // 初始化 SFX 池(初始 1 个,可动态扩展) poolDict["SFX"] = new Queue(); CreateAudioSource("SFX"); } @@ -135,5 +135,14 @@ namespace Stary.Evo.AudioCore } poolDict.Clear(); } + + public void Dispose() + { + if (poolObject != null) + { + GameObject.Destroy(poolObject); + } + poolDict.Clear(); + } } } \ No newline at end of file diff --git a/Assets/04.AudioCore/RunTime/Base/CoroutineHelper.cs b/Assets/04.AudioCore/RunTime/Base/CoroutineHelper.cs index 12d8759..19dc7c0 100644 --- a/Assets/04.AudioCore/RunTime/Base/CoroutineHelper.cs +++ b/Assets/04.AudioCore/RunTime/Base/CoroutineHelper.cs @@ -5,36 +5,52 @@ using UnityEngine.Internal; namespace Stary.Evo.AudioCore { - public static class CoroutineHelper + // 音频协程启动器 + public class CoroutineHelper : IDisposable { - public static CoroutineRunner coroutineRunner; - - public static void SetRunner() + private static CoroutineHelper _instance = new CoroutineHelper(); + public static CoroutineHelper Instance => _instance; + private CoroutineRunner _coroutineRunner; + + private CoroutineHelper() { GameObject runnerObject = new GameObject("CoroutineRunner"); - coroutineRunner = runnerObject.AddComponent(); + _coroutineRunner= runnerObject.AddComponent(); } - public static Coroutine StartCoroutine(IEnumerator coroutine) + public Coroutine StartCoroutine(IEnumerator coroutine) { - Coroutine myCoroutine = coroutineRunner.StartCoroutine(coroutine); + Coroutine myCoroutine = _coroutineRunner.StartIEnumerator(coroutine); return myCoroutine; } - public static void StopCoroutine(Coroutine myCoroutine) + public void StopCoroutine(Coroutine myCoroutine) { - coroutineRunner.StopCoroutine(myCoroutine); + _coroutineRunner.StopIEnumerator(myCoroutine); } - + public void Dispose() + { + if (_coroutineRunner != null) + { + GameObject.Destroy(_coroutineRunner.gameObject); + _coroutineRunner = null; + } + if (CoroutineHelper.Instance != null) + { + CoroutineHelper._instance = null; + } + } + public class CoroutineRunner : MonoBehaviour { - private void OnDestroy() + public Coroutine StartIEnumerator(IEnumerator coroutine) { - if (coroutineRunner != null) - { - coroutineRunner.StopAllCoroutines(); - coroutineRunner = null; - } - + Coroutine myCoroutine = StartCoroutine(coroutine); + return myCoroutine; + } + public void StopIEnumerator(Coroutine myCoroutine) + { + StopCoroutine(myCoroutine); } } } } + diff --git a/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs b/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs index 27f5532..e532468 100644 --- a/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs +++ b/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs @@ -121,10 +121,10 @@ namespace Stary.Evo.AudioCore if (myCoroutine != null) { - CoroutineHelper.StopCoroutine(myCoroutine); + CoroutineHelper.Instance.StopCoroutine(myCoroutine); myCoroutine = null; } - myCoroutine = CoroutineHelper.StartCoroutine(SetMusicVolume(audioData.fadeDuration, audioData.volume)); + myCoroutine = CoroutineHelper.Instance.StartCoroutine(SetMusicVolume(audioData.fadeDuration, audioData.volume)); } /// @@ -164,11 +164,11 @@ namespace Stary.Evo.AudioCore /// private void FadeMusic(AudioSource source1, float fadeDuration, AudioSource source2 = null) { - CoroutineHelper.StartCoroutine(FadeInMusic(source1, fadeDuration)); + CoroutineHelper.Instance.StartCoroutine(FadeInMusic(source1, fadeDuration)); if (source2 != null) { - CoroutineHelper.StartCoroutine(FadeOutMusic(source2, fadeDuration)); + CoroutineHelper.Instance.StartCoroutine(FadeOutMusic(source2, fadeDuration)); } } diff --git a/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs b/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs index f9842d5..883a673 100644 --- a/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs +++ b/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs @@ -64,7 +64,7 @@ namespace Stary.Evo.AudioCore activeSources.Add(source); // 使用协程处理延迟和回调 - CoroutineHelper.StartCoroutine(PlaySFXCoroutine(source, audioData.delayOnCompleteTime, audioData.onComplete)); + CoroutineHelper.Instance.StartCoroutine(PlaySFXCoroutine(source, audioData.delayOnCompleteTime, audioData.onComplete)); } /// diff --git a/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs b/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs index a4038f8..8fec832 100644 --- a/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs +++ b/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs @@ -33,7 +33,7 @@ namespace Stary.Evo.AudioCore if (myCoroutine != null) { - CoroutineHelper.StopCoroutine(myCoroutine); + CoroutineHelper.Instance.StopCoroutine(myCoroutine); myCoroutine = null; } currentSource = audioSourcePool.GetAudioSource("Voice"); @@ -69,7 +69,7 @@ namespace Stary.Evo.AudioCore currentSource.Play(); // 使用协程处理延迟和回调 - myCoroutine = CoroutineHelper.StartCoroutine(PlayVoiceCoroutine(currentSource, audioData.delayOnCompleteTime, audioData.onComplete)); + myCoroutine = CoroutineHelper.Instance.StartCoroutine(PlayVoiceCoroutine(currentSource, audioData.delayOnCompleteTime, audioData.onComplete)); } /// @@ -86,7 +86,7 @@ namespace Stary.Evo.AudioCore currentSource = null; if (myCoroutine != null) { - CoroutineHelper.StopCoroutine(myCoroutine); + CoroutineHelper.Instance.StopCoroutine(myCoroutine); myCoroutine = null; } } @@ -106,12 +106,13 @@ namespace Stary.Evo.AudioCore /// {[clip:音频], [volume:音量], /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间], /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], - /// [audio3DMaxDistance:3D音频最大距离]} + /// [audio3DMaxDistance:3D音频最大距离], + /// [cancellationToken:异步取消令牌]} public async Task PlayAsync(AudioData audioData) { // 停止当前正在播放的语音与旧协程,或旧异步 Stop(); - + audioData = AudioDataInitialize(audioData); currentSource = audioSourcePool.GetAudioSource("Voice"); if (currentSource == null) return; @@ -141,9 +142,9 @@ namespace Stary.Evo.AudioCore currentSource.minDistance = 1f; currentSource.maxDistance = 500f; } + currentSource.Play(); - cancelTokenSource = new CancellationTokenSource(); - await Task.Delay(TimeSpan.FromSeconds(audioData.clip.length),cancelTokenSource.Token); + await Task.Delay(TimeSpan.FromSeconds(audioData.clip.length), audioData.cancellationToken); } /// diff --git a/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs b/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs index 32ad91d..ae1d428 100644 --- a/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs +++ b/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs @@ -42,7 +42,8 @@ namespace Stary.Evo.AudioCore /// {[clip:音频], [volume:音量], /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间], /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], - /// [audio3DMaxDistance:3D音频最大距离]} + /// [audio3DMaxDistance:3D音频最大距离], + /// [cancellationToken:异步取消令牌]} /// public static Task PlayAsyncVoice(AudioData audioData) { @@ -137,7 +138,7 @@ namespace Stary.Evo.AudioCore StopVoice(); StopAllSFX(); - //StopMusic(); + StopMusic(); } } diff --git a/Assets/04.AudioCore/package.json b/Assets/04.AudioCore/package.json index a39da48..5a8576e 100644 --- a/Assets/04.AudioCore/package.json +++ b/Assets/04.AudioCore/package.json @@ -1,6 +1,6 @@ { "name": "com.staryevo.audiocore", - "version": "1.0.19", + "version": "1.0.20", "displayName": "04.AudioCore", "description": "音频播放工具", "unity": "2021.3",