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",