From 4e8a58fdef6575be30fed7683e8d376cbbfe3adc Mon Sep 17 00:00:00 2001 From: Han <1985708279@qq.com> Date: Wed, 4 Jun 2025 14:57:54 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90a=E3=80=91=E5=BC=82=E6=AD=A5=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E8=AF=AD=E9=9F=B3=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../04.AudioCore/RunTime/Abstract/IAudio.cs | 6 ++- .../04.AudioCore/RunTime/Base/MusicPlayer.cs | 11 ----- Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs | 2 +- .../04.AudioCore/RunTime/Base/VoicePlayer.cs | 44 ++++++++++++++++--- .../RunTime/Use/AudioCoreManager.cs | 17 +++++-- Assets/04.AudioCore/package.json | 2 +- 6 files changed, 59 insertions(+), 23 deletions(-) diff --git a/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs b/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs index 9e1c84d..90cb691 100644 --- a/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs +++ b/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs @@ -61,12 +61,16 @@ namespace Stary.Evo.AudioCore void Stop(AudioData audioData); + void Stop(); + } public abstract class AbstractAudio : IAudio { public abstract void Play(AudioData audioData); - public abstract void Stop(AudioData audioData); + public virtual void Stop(AudioData audioData){} + + public virtual void Stop(){} /// /// 音频数据初始化 diff --git a/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs b/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs index affb413..b05d2a7 100644 --- a/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs +++ b/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs @@ -57,8 +57,6 @@ namespace Stary.Evo.AudioCore /// {[fadeDuration:自然过渡时间]} public override void Stop(AudioData audioData) { - //audioData = AudioDataInitialize(audioData); - //CoroutineHelper.StartCoroutine(FadeOutMusic(currentAudioSource, audioData.fadeDuration)); FadeAllMusic(); } @@ -151,15 +149,6 @@ namespace Stary.Evo.AudioCore audioSource2 = null; } audioSourcePool.ReturnAudioSource("Music", source.gameObject); - - /*if (currentAudioSource == audioSource1) - { - audioSource2 = null; - } - else if (currentAudioSource == audioSource2) - { - audioSource1 = null; - }*/ } private void FadeAllMusic() diff --git a/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs b/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs index f816d4f..6674340 100644 --- a/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs +++ b/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs @@ -46,7 +46,7 @@ namespace Stary.Evo.AudioCore /// 停止所有音效 /// /// {[无可使用变量]} - public override void Stop(AudioData audioData) + public override void Stop() { if (activeSources == null) return; foreach (var source in activeSources) diff --git a/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs b/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs index dcc8a13..5572423 100644 --- a/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs +++ b/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs @@ -1,4 +1,7 @@ -using System.Collections; +using System; +using System.Collections; +using System.Threading; +using System.Threading.Tasks; using UnityEngine; namespace Stary.Evo.AudioCore @@ -8,7 +11,7 @@ namespace Stary.Evo.AudioCore private AudioSourcePool audioSourcePool; private AudioSource currentSource; private Coroutine myCoroutine; - + private CancellationTokenSource cancelTokenSource; public VoicePlayer(AudioSourcePool audioSourcePool) { this.audioSourcePool = audioSourcePool; @@ -21,8 +24,8 @@ namespace Stary.Evo.AudioCore /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} public override void Play(AudioData audioData) { - // 停止当前正在播放的语音与旧协程 - Stop(new AudioData { }); + // 停止当前正在播放的语音与旧协程,或旧异步 + Stop(); audioData = AudioDataInitialize(audioData); @@ -46,8 +49,9 @@ namespace Stary.Evo.AudioCore /// 停止语音 /// /// /// {[无可使用变量]} - public override void Stop(AudioData audioData) + public override void Stop() { + // 停止当前协程 if (currentSource != null && currentSource.isPlaying) { currentSource.Stop(); @@ -58,8 +62,36 @@ namespace Stary.Evo.AudioCore CoroutineHelper.StopCoroutine(myCoroutine); myCoroutine = null; } - } + + // 停掉异步任务 + if (cancelTokenSource != null && cancelTokenSource.IsCancellationRequested) + { + cancelTokenSource .Cancel(); + cancelTokenSource.Dispose(); + cancelTokenSource = null; + } + } + + /// + /// 异步播放语音 + /// + /// + /// + public async Task Play(AudioClip audioClip, float volume) + { + // 停止当前正在播放的语音与旧协程,或旧异步 + Stop(); + + currentSource = audioSourcePool.GetAudioSource("Voice"); + if (currentSource == null) return; + + currentSource.clip = audioClip; + currentSource.volume = volume; + currentSource.Play(); + + cancelTokenSource = new CancellationTokenSource(); + await Task.Delay(TimeSpan.FromSeconds(audioClip.length),cancelTokenSource.Token); } /// diff --git a/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs b/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs index c836877..15fefc1 100644 --- a/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs +++ b/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs @@ -1,6 +1,7 @@ using UnityEngine; using System.Collections.Generic; using System.Security.Cryptography.X509Certificates; +using System.Threading.Tasks; namespace Stary.Evo.AudioCore { @@ -32,13 +33,23 @@ namespace Stary.Evo.AudioCore Voice.Play(audioData); } + /// + /// 异步播放语音 + /// + /// + /// + /// + public static Task PlayVoice(AudioClip audioClip, float volume = 1f) + { + return Voice.Play(audioClip, volume); + } + /// /// 停止当前的语音 /// public static void StopVoice() { - AudioData audioData = new AudioData(); - Voice.Stop(audioData); + Voice.Stop(); } #endregion @@ -62,7 +73,7 @@ namespace Stary.Evo.AudioCore public static void StopAllSFX() { AudioData audioData = new AudioData(); - SFX.Stop(audioData); + SFX.Stop(); } #endregion diff --git a/Assets/04.AudioCore/package.json b/Assets/04.AudioCore/package.json index 9e2afe4..461e96b 100644 --- a/Assets/04.AudioCore/package.json +++ b/Assets/04.AudioCore/package.json @@ -1,6 +1,6 @@ { "name": "com.staryevo.audiocore", - "version": "1.0.9", + "version": "1.0.10", "displayName": "04.AudioCore", "description": "音频播放工具", "unity": "2021.3",