diff --git a/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs b/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs index 90cb691..0c10290 100644 --- a/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs +++ b/Assets/04.AudioCore/RunTime/Abstract/IAudio.cs @@ -43,16 +43,21 @@ namespace Stary.Evo.AudioCore /// 是否不打断上一段对话 /// public bool isNotOverVoice; + + /// + /// 是否是3D音频 + /// + public bool is3DAudio; /// - /// 是否是3D声音 + /// 3D声音位置 /// - public bool is3D; - + public Vector3 audio3DPosition; + /// - /// 3D声音载体 + /// 3D声音最大距离 /// - public GameObject soundObject; + public float audio3DMaxDistance; } public interface IAudio @@ -83,6 +88,11 @@ namespace Stary.Evo.AudioCore { audioData.volume = 1f; } + + if (audioData.fadeDuration == 0) + { + audioData.fadeDuration = 1f; + } return audioData; } } diff --git a/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs b/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs index 13ece29..27f5532 100644 --- a/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs +++ b/Assets/04.AudioCore/RunTime/Base/MusicPlayer.cs @@ -19,7 +19,8 @@ namespace Stary.Evo.AudioCore /// /// 播放背景音乐 /// - /// {[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]} + /// {[clip:音频], [volume:音量], [fadeDuration:自然过渡时间], + /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], [audio3DMaxDistance:3D音频最大距离]} public override void Play(AudioData audioData) { audioData = AudioDataInitialize(audioData); @@ -28,6 +29,31 @@ namespace Stary.Evo.AudioCore audioSource1 = audioSourcePool.GetAudioSource("Music"); audioSource1.clip = audioData.clip; audioSource1.volume = audioData.volume; + + // 设置2D与3D音频 + if (audioData.is3DAudio) + { + audioSource1.transform.position = audioData.audio3DPosition; + audioSource1.spatialBlend = 1; + audioSource1.minDistance = 1f; + if (audioData.audio3DMaxDistance != 0) + { + audioSource1.maxDistance = audioData.audio3DMaxDistance; + } + else + { + // 默认3D最大距离为3米 + audioSource1.maxDistance = 3f; + } + } + else + { + audioSource1.transform.position = Vector3.zero; + audioSource1.spatialBlend = 0; + audioSource1.minDistance = 1f; + audioSource1.maxDistance = 500f; + } + currentAudioSource = audioSource1; currentAudioSource.Play(); FadeMusic(audioSource1, audioData.fadeDuration, audioSource2); @@ -39,6 +65,31 @@ namespace Stary.Evo.AudioCore audioSource2 = audioSourcePool.GetAudioSource("Music"); audioSource2.clip = audioData.clip; audioSource2.volume = audioData.volume; + + // 设置2D与3D音频 + if (audioData.is3DAudio) + { + audioSource2.transform.position = audioData.audio3DPosition; + audioSource2.spatialBlend = 1; + audioSource2.minDistance = 1f; + if (audioData.audio3DMaxDistance != 0) + { + audioSource2.maxDistance = audioData.audio3DMaxDistance; + } + else + { + // 默认3D最大距离为3米 + audioSource2.maxDistance = 3f; + } + } + else + { + audioSource2.transform.position = Vector3.zero; + audioSource2.spatialBlend = 0; + audioSource2.minDistance = 1f; + audioSource2.maxDistance = 500f; + } + currentAudioSource = audioSource2; currentAudioSource.Play(); FadeMusic(audioSource2, audioData.fadeDuration, audioSource1); diff --git a/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs b/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs index 6674340..f9842d5 100644 --- a/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs +++ b/Assets/04.AudioCore/RunTime/Base/SFXPlayer.cs @@ -18,7 +18,8 @@ namespace Stary.Evo.AudioCore /// 播放音效 /// /// {[clip:音频], [volume:音量], - /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} + /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间], + /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], [audio3DMaxDistance:3D音频最大距离]} public override void Play(AudioData audioData) { audioData = AudioDataInitialize(audioData); @@ -33,6 +34,30 @@ namespace Stary.Evo.AudioCore 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 加入活动列表 diff --git a/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs b/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs index 5572423..a4038f8 100644 --- a/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs +++ b/Assets/04.AudioCore/RunTime/Base/VoicePlayer.cs @@ -21,7 +21,9 @@ namespace Stary.Evo.AudioCore /// 播放语音 /// /// {[clip:音频], [volume:音量], - /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} + /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间], + /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], + /// [audio3DMaxDistance:3D音频最大距离]} public override void Play(AudioData audioData) { // 停止当前正在播放的语音与旧协程,或旧异步 @@ -39,6 +41,31 @@ namespace Stary.Evo.AudioCore currentSource.clip = audioData.clip; currentSource.volume = audioData.volume; + + // 设置2D与3D音频 + if (audioData.is3DAudio) + { + currentSource.transform.position = audioData.audio3DPosition; + currentSource.spatialBlend = 1; + currentSource.minDistance = 1f; + if (audioData.audio3DMaxDistance != 0) + { + currentSource.maxDistance = audioData.audio3DMaxDistance; + } + else + { + // 默认3D最大距离为3米 + currentSource.maxDistance = 3f; + } + } + else + { + currentSource.transform.position = Vector3.zero; + currentSource.spatialBlend = 0; + currentSource.minDistance = 1f; + currentSource.maxDistance = 500f; + } + currentSource.Play(); // 使用协程处理延迟和回调 @@ -76,9 +103,11 @@ namespace Stary.Evo.AudioCore /// /// 异步播放语音 /// - /// - /// - public async Task Play(AudioClip audioClip, float volume) + /// {[clip:音频], [volume:音量], + /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间], + /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], + /// [audio3DMaxDistance:3D音频最大距离]} + public async Task PlayAsync(AudioData audioData) { // 停止当前正在播放的语音与旧协程,或旧异步 Stop(); @@ -86,12 +115,35 @@ namespace Stary.Evo.AudioCore currentSource = audioSourcePool.GetAudioSource("Voice"); if (currentSource == null) return; - currentSource.clip = audioClip; - currentSource.volume = volume; + currentSource.clip = audioData.clip; + currentSource.volume = audioData.volume; + + // 设置2D与3D音频 + if (audioData.is3DAudio) + { + currentSource.transform.position = audioData.audio3DPosition; + currentSource.spatialBlend = 1; + currentSource.minDistance = 1f; + if (audioData.audio3DMaxDistance != 0) + { + currentSource.maxDistance = audioData.audio3DMaxDistance; + } + else + { + // 默认3D最大距离为3米 + currentSource.maxDistance = 3f; + } + } + else + { + currentSource.transform.position = Vector3.zero; + currentSource.spatialBlend = 0; + currentSource.minDistance = 1f; + currentSource.maxDistance = 500f; + } currentSource.Play(); - cancelTokenSource = new CancellationTokenSource(); - await Task.Delay(TimeSpan.FromSeconds(audioClip.length),cancelTokenSource.Token); + await Task.Delay(TimeSpan.FromSeconds(audioData.clip.length),cancelTokenSource.Token); } /// diff --git a/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs b/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs index 71563da..a17ed43 100644 --- a/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs +++ b/Assets/04.AudioCore/RunTime/Use/AudioCoreManager.cs @@ -27,7 +27,9 @@ namespace Stary.Evo.AudioCore /// 播放语音 /// /// {[clip:音频], [volume:音量], - /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} + /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间], + /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], + /// [audio3DMaxDistance:3D音频最大距离]} public static void PlayVoice(AudioData audioData) { if(Voice == null) Initialize(); @@ -37,13 +39,15 @@ namespace Stary.Evo.AudioCore /// /// 异步播放语音 /// - /// - /// + /// {[clip:音频], [volume:音量], + /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间], + /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], + /// [audio3DMaxDistance:3D音频最大距离]} /// - public static Task PlayVoice(AudioClip audioClip, float volume = 1f) + public static Task PlayAsyncVoice(AudioData audioData) { if(Voice == null) Initialize(); - return Voice.Play(audioClip, volume); + return Voice.PlayAsync(audioData); } /// @@ -63,7 +67,9 @@ namespace Stary.Evo.AudioCore /// 播放音效 /// /// {[clip:音频], [volume:音量], - /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} + /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间], + /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], + /// [audio3DMaxDistance:3D音频最大距离]} public static void PlaySFX(AudioData audioData) { if(SFX == null) Initialize(); @@ -87,10 +93,12 @@ namespace Stary.Evo.AudioCore /// /// 播放背景音乐 /// - /// {[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]} + /// {[clip:音频], [volume:音量], [fadeDuration:自然过渡时间], + /// [is3DAudio:是否3D音频], [audio3DPosition:3D音频位置], + /// [audio3DMaxDistance:3D音频最大距离]} public static void PlayMusic(AudioData audioData) { - if(CoroutineHelper.coroutineRunner == null) Initialize(); + if(Music == null) Initialize(); Music.Play(audioData); } diff --git a/Assets/04.AudioCore/package.json b/Assets/04.AudioCore/package.json index fc75df0..552ba80 100644 --- a/Assets/04.AudioCore/package.json +++ b/Assets/04.AudioCore/package.json @@ -1,6 +1,6 @@ { "name": "com.staryevo.audiocore", - "version": "1.0.14", + "version": "1.0.16", "displayName": "04.AudioCore", "description": "音频播放工具", "unity": "2021.3",