From 63b6601fbe680da232841f88876373308560217d Mon Sep 17 00:00:00 2001 From: Han <1985708279@qq.com> Date: Fri, 7 Mar 2025 17:52:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0struct=E7=AE=A1=E7=90=86Audio?= =?UTF-8?q?Data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../04.AudioCore/RunTime/AudioCoreManager.cs | 62 +++++--------- Assets/04.AudioCore/RunTime/IAudio.cs | 83 +++++++++++++++---- Assets/04.AudioCore/RunTime/MusicPlayer.cs | 30 +++---- Assets/04.AudioCore/RunTime/SFXPlayer.cs | 19 ++--- Assets/04.AudioCore/RunTime/Test.cs | 12 +-- Assets/04.AudioCore/RunTime/VoicePlayer.cs | 26 +++--- 6 files changed, 131 insertions(+), 101 deletions(-) diff --git a/Assets/04.AudioCore/RunTime/AudioCoreManager.cs b/Assets/04.AudioCore/RunTime/AudioCoreManager.cs index 1bd0ad3..eea588a 100644 --- a/Assets/04.AudioCore/RunTime/AudioCoreManager.cs +++ b/Assets/04.AudioCore/RunTime/AudioCoreManager.cs @@ -22,24 +22,11 @@ public static class AudioCoreManager /// /// 播放语音 /// - /// 音频 - /// 结束行为 - /// 结束行为延迟执行时间 - public static void PlayVoice(AudioClip clip, System.Action onComplete, float delay = 0f) + /// {[clip:音频], [volume:音量], + /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} + public static void PlayVoice(AudioData audioData) { - Voice.Play(clip, 1f, onComplete, delay); - } - - /// - /// 播放语音 - /// - /// 音频 - /// 音量 - /// 结束行为 - /// 结束行为延迟执行时间 - public static void PlayVoice(AudioClip clip, float volume = 1f, System.Action onComplete = null, float delay = 0f) - { - Voice.Play(clip, volume, onComplete, delay); + Voice.Play(audioData); } /// @@ -47,7 +34,8 @@ public static class AudioCoreManager /// public static void StopVoice() { - Voice.Stop(); + AudioData audioData = new AudioData(); + Voice.Stop(audioData); } #endregion @@ -57,24 +45,11 @@ public static class AudioCoreManager /// /// 播放音效 /// - /// 音频 - /// 结束行为 - /// 结束行为延迟执行时间 - public static void PlaySFX(AudioClip clip, System.Action onComplete, float delay = 0f) + /// {[clip:音频], [volume:音量], + /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} + public static void PlaySFX(AudioData audioData) { - SFX.Play(clip, 1f, onComplete, delay); - } - - /// - /// 播放音效 - /// - /// 音频 - /// 音量 - /// 结束行为 - /// 结束行为延迟执行时间 - public static void PlaySFX(AudioClip clip, float volume = 1f, System.Action onComplete = null, float delay = 0f) - { - SFX.Play(clip, volume, onComplete, delay); + SFX.Play(audioData); } /// @@ -82,7 +57,8 @@ public static class AudioCoreManager /// public static void StopAllSFX() { - SFX.Stop(); + AudioData audioData = new AudioData(); + SFX.Stop(audioData); } #endregion @@ -92,21 +68,21 @@ public static class AudioCoreManager /// /// 播放背景音乐 /// - /// 音频 - /// 音量 - /// 自然过渡时间 - public static void PlayMusic(AudioClip clip, float volume = 1f, float fadeDuration = 1f) + /// {[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]} + public static void PlayMusic(AudioData audioData) { - Music.Play(clip, volume, fadeDuration); + Music.Play(audioData); } - + /// /// 停止播放背景音乐 /// /// 自然过渡时间 public static void StopMusic(float fadeDuration = 1f) { - Music.Stop(fadeDuration); + AudioData audioData = new AudioData(); + audioData.fadeDuration = fadeDuration; + Music.Stop(audioData); } #endregion diff --git a/Assets/04.AudioCore/RunTime/IAudio.cs b/Assets/04.AudioCore/RunTime/IAudio.cs index ee188a8..c971a94 100644 --- a/Assets/04.AudioCore/RunTime/IAudio.cs +++ b/Assets/04.AudioCore/RunTime/IAudio.cs @@ -2,28 +2,81 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +/// +/// Audio数据 +/// +public struct AudioData +{ + /// + /// 延迟播放时间 + /// + public float delayTime; + + /// + /// 音频 + /// + public AudioClip clip; + + /// + /// 音量 + /// + public float volume; + + /// + /// 回调行为 + /// + public System.Action onComplete; + + /// + /// 延迟回调执行的时间 + /// + public float delayOnCompleteTime; + + /// + /// 自然过渡时间 + /// + public float fadeDuration; + + /// + /// 是否不打断上一段对话 + /// + public bool isNotOverVoice; + + /// + /// 是否是3D声音 + /// + public bool is3D; + + /// + /// 3D声音载体 + /// + public GameObject soundObject; +} + public interface IAudio { - void Play(AudioClip audioClip,float volume, System.Action onComplete, float delay); + void Play(AudioData audioData); - void Stop(); - - void Stop(float delay); - - void EndOperation(System.Action onComplete, float delay); - - void Set3DPosition(Vector3 vector3); + void Stop(AudioData audioData); } public abstract class AbstractAudio : IAudio { - public abstract void Play(AudioClip audioClip, float volume, System.Action onComplete, float delay); + public abstract void Play(AudioData audioData); - public abstract void Stop(); + public abstract void Stop(AudioData audioData); - public abstract void Stop(float delay); - - public abstract void EndOperation(System.Action onComplete, float delay); - - public abstract void Set3DPosition(Vector3 vector3); + /// + /// 音频数据初始化 + /// + /// + /// + public virtual AudioData AudioDataInitialize(AudioData audioData) + { + if(audioData.volume == 0) + { + audioData.volume = 1f; + } + return audioData; + } } diff --git a/Assets/04.AudioCore/RunTime/MusicPlayer.cs b/Assets/04.AudioCore/RunTime/MusicPlayer.cs index d8fff31..47d7dc4 100644 --- a/Assets/04.AudioCore/RunTime/MusicPlayer.cs +++ b/Assets/04.AudioCore/RunTime/MusicPlayer.cs @@ -1,7 +1,7 @@ using System.Collections; using UnityEngine; -public class MusicPlayer +public class MusicPlayer : AbstractAudio { private AudioSourcePool audioSourcePool; private AudioSource audioSource1; @@ -16,30 +16,29 @@ public class MusicPlayer /// /// 播放背景音乐 /// - /// 音频 - /// 音量 - /// 自然过渡时间 - public void Play(AudioClip clip, float volume, float fadeDuration) + /// {[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]} + public override void Play(AudioData audioData) { - if(audioSource1 == null) + audioData = AudioDataInitialize(audioData); + if (audioSource1 == null) { audioSource1 = audioSourcePool.GetAudioSource("Music"); - audioSource1.clip = clip; - audioSource1.volume = volume; + audioSource1.clip = audioData.clip; + audioSource1.volume = audioData.volume; currentAudioSource = audioSource1; currentAudioSource.Play(); - CoroutineHelper.StartCoroutine(FadeMusic(audioSource1, fadeDuration, audioSource2)); + CoroutineHelper.StartCoroutine(FadeMusic(audioSource1, audioData.fadeDuration, audioSource2)); } else { if (audioSource2 == null) { audioSource2 = audioSourcePool.GetAudioSource("Music"); - audioSource2.clip = clip; - audioSource2.volume = volume; + audioSource2.clip = audioData.clip; + audioSource2.volume = audioData.volume; currentAudioSource = audioSource2; currentAudioSource.Play(); - CoroutineHelper.StartCoroutine(FadeMusic(audioSource2, fadeDuration, audioSource1)); + CoroutineHelper.StartCoroutine(FadeMusic(audioSource2, audioData.fadeDuration, audioSource1)); } else { @@ -52,10 +51,11 @@ public class MusicPlayer /// /// 关闭背景音乐 /// - /// 关闭时的自然过渡时间 - public void Stop(float fadeDuration) + /// {[fadeDuration:自然过渡时间]} + public override void Stop(AudioData audioData) { - CoroutineHelper.StartCoroutine(FadeOutMusic(currentAudioSource, fadeDuration)); + audioData = AudioDataInitialize(audioData); + CoroutineHelper.StartCoroutine(FadeOutMusic(currentAudioSource, audioData.fadeDuration)); } /// diff --git a/Assets/04.AudioCore/RunTime/SFXPlayer.cs b/Assets/04.AudioCore/RunTime/SFXPlayer.cs index e599231..4fcc960 100644 --- a/Assets/04.AudioCore/RunTime/SFXPlayer.cs +++ b/Assets/04.AudioCore/RunTime/SFXPlayer.cs @@ -2,7 +2,7 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; -public class SFXPlayer +public class SFXPlayer : AbstractAudio { private AudioSourcePool audioSourcePool; private List activeSources = new List(); // 正在播放的 AudioSource 列表 @@ -15,30 +15,29 @@ public class SFXPlayer /// /// 播放音效 /// - /// 音频 - /// 音量 - /// 结束行为 - /// 延迟结束行为时间 - public void Play(AudioClip clip, float volume = 1f, System.Action onComplete = null, float delay = 0f) + /// {[clip:音频], [volume:音量], + /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} + public override void Play(AudioData audioData) { AudioSource source = audioSourcePool.GetAudioSource("SFX"); if (source == null) return; - source.clip = clip; - source.volume = volume; + source.clip = audioData.clip; + source.volume = audioData.volume; source.Play(); // 将 AudioSource 加入活动列表 activeSources.Add(source); // 使用协程处理延迟和回调 - CoroutineHelper.StartCoroutine(PlaySFXCoroutine(source, delay, onComplete)); + CoroutineHelper.StartCoroutine(PlaySFXCoroutine(source, audioData.delayOnCompleteTime, audioData.onComplete)); } /// /// 停止所有音效 /// - public void Stop() + /// {[无可使用变量]} + public override void Stop(AudioData audioData) { foreach (var source in activeSources) { diff --git a/Assets/04.AudioCore/RunTime/Test.cs b/Assets/04.AudioCore/RunTime/Test.cs index d2e496a..ffd9fb6 100644 --- a/Assets/04.AudioCore/RunTime/Test.cs +++ b/Assets/04.AudioCore/RunTime/Test.cs @@ -21,27 +21,27 @@ public class Test : MonoBehaviour { if (Input.GetKeyDown(KeyCode.A)) { - AudioCoreManager.PlayVoice(clip1); + AudioCoreManager.PlayVoice(new AudioData { clip = clip1 }); } if (Input.GetKeyDown(KeyCode.S)) { - AudioCoreManager.PlayVoice(clip2); + AudioCoreManager.PlayVoice(new AudioData { clip = clip2 }); } if (Input.GetKeyDown(KeyCode.D)) { - AudioCoreManager.PlaySFX(clip21); + AudioCoreManager.PlaySFX(new AudioData { clip = clip21 }); } if (Input.GetKeyDown(KeyCode.F)) { - AudioCoreManager.PlaySFX(clip22); + AudioCoreManager.PlaySFX(new AudioData { clip = clip22 }); } if (Input.GetKeyDown(KeyCode.G)) { - AudioCoreManager.PlayMusic(clip31); + AudioCoreManager.PlayMusic(new AudioData { clip = clip31 }); } if (Input.GetKeyDown(KeyCode.H)) { - AudioCoreManager.PlayMusic(clip32); + AudioCoreManager.PlayMusic(new AudioData { clip = clip32 }); } if (Input.GetKeyDown(KeyCode.Z)) { diff --git a/Assets/04.AudioCore/RunTime/VoicePlayer.cs b/Assets/04.AudioCore/RunTime/VoicePlayer.cs index 452dcb9..da48bc0 100644 --- a/Assets/04.AudioCore/RunTime/VoicePlayer.cs +++ b/Assets/04.AudioCore/RunTime/VoicePlayer.cs @@ -1,7 +1,7 @@ using System.Collections; using UnityEngine; -public class VoicePlayer +public class VoicePlayer : AbstractAudio { private AudioSourcePool audioSourcePool; private AudioSource currentSource; @@ -15,15 +15,16 @@ public class VoicePlayer /// /// 播放语音 /// - /// 音频 - /// 音量 - /// 结束行为 - /// 延迟结束行为时间 - public void Play(AudioClip clip, float volume = 1f, System.Action onComplete = null, float delayOnComplete = 0f) + /// {[clip:音频], [volume:音量], + /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]} + public override void Play(AudioData audioData) { // 停止当前正在播放的语音与旧协程 - Stop(); - if(myCoroutine!= null) + Stop(new AudioData { }); + + audioData = AudioDataInitialize(audioData); + + if (myCoroutine!= null) { CoroutineHelper.StopCoroutine(myCoroutine); myCoroutine = null; @@ -31,18 +32,19 @@ public class VoicePlayer currentSource = audioSourcePool.GetAudioSource("Voice"); if (currentSource == null) return; - currentSource.clip = clip; - currentSource.volume = volume; + currentSource.clip = audioData.clip; + currentSource.volume = audioData.volume; currentSource.Play(); // 使用协程处理延迟和回调 - myCoroutine = CoroutineHelper.StartCoroutine(PlayVoiceCoroutine(currentSource, delayOnComplete, onComplete)); + myCoroutine = CoroutineHelper.StartCoroutine(PlayVoiceCoroutine(currentSource, audioData.delayOnCompleteTime, audioData.onComplete)); } /// /// 停止语音 /// - public void Stop() + /// /// {[无可使用变量]} + public override void Stop(AudioData audioData) { if (currentSource != null && currentSource.isPlaying) {