From 3d44ac939b080b43a4d72842b91c018612ac49f1 Mon Sep 17 00:00:00 2001 From: Oliver Wong Date: Fri, 3 Apr 2026 11:53:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E9=9F=B3=E9=A2=91?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=20-=20=E9=87=8D=E5=91=BD=E5=90=8DAudioSchedu?= =?UTF-8?q?ler=E4=B8=BASfxSystem=E5=B9=B6=E6=B7=BB=E5=8A=A0Accented?= =?UTF-8?q?=E9=9F=B3=E6=95=88=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将AudioScheduler重命名为SfxSystem,统一命名规范 - 新增MixingType.Accented音效类型,支持强调音效独立混音 - 重构音频混合器层级: Master下新增Regular中间层 - SfxSystem使用外部AudioSourcePool,与MusicSystem隔离 - 修复ambiencePoolRoot父节点错误(原错误挂载到musicPoolRoot) - Play方法支持onPlay回调 - 同步更新AudioObject.bytes二进制配置数据 --- Assets/Resources/AudioData/AudioObject.bytes | Bin 7567 -> 7567 bytes .../Resources/AudioData/MusicTransition.bytes | Bin 29 -> 29 bytes Assets/Resources/Audios/Master.mixer | 126 ++++++++++++++++-- Assets/Scenes/SampleScene.unity | 14 +- .../OCES/Audio/Generated/AudioObject.cs | 1 + .../OCES/Audio/HandWritten/AudioSystem.cs | 27 ++-- .../HandWritten/HandWrittenDefinitions.cs | 2 +- .../{AudioScheduler.cs => SfxSystem.cs} | 38 ++++-- ...dioScheduler.cs.meta => SfxSystem.cs.meta} | 0 9 files changed, 173 insertions(+), 35 deletions(-) rename Assets/Scripts/OCES/Audio/HandWritten/{AudioScheduler.cs => SfxSystem.cs} (94%) rename Assets/Scripts/OCES/Audio/HandWritten/{AudioScheduler.cs.meta => SfxSystem.cs.meta} (100%) diff --git a/Assets/Resources/AudioData/AudioObject.bytes b/Assets/Resources/AudioData/AudioObject.bytes index e8ae4212d3312474464e86500d5f1903bf406f42..330a5f630f1a55d960b61b443072b6a5f16e6435 100644 GIT binary patch delta 22 ccmeCT?zi4h&BV$81k95UGD>Zp#q?DQ07;()mjD0& delta 19 bcmeCT?zi4h&BS!Te)2?S+0C< public MixingType MixingType { get; set; } diff --git a/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs b/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs index 2814973..fa09d5d 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs @@ -14,7 +14,7 @@ namespace OCES.Audio const string k_audioConfigPath = "AudioData"; const string k_audioResourcePath = "Audios"; - AudioScheduler m_scheduler; + SfxSystem m_sfxSystem; MusicSystem m_musicSystem; AudioObjectConfig m_audioObjects; @@ -26,16 +26,18 @@ namespace OCES.Audio // 公开接口 // ───────────────────────────────────────────── - public void Play(uint audioId) + public void Play(uint audioId, Action onPlay = null) { AudioObject obj = this.m_audioObjects.QueryById(audioId); if (obj != null) - Play(obj); + { + Play(obj, onPlay); + } } - public void Play(AudioObject audioObject) + public void Play(AudioObject audioObject, Action onPlay = null) { - this.m_scheduler.TryPlay(audioObject); + this.m_sfxSystem.TryPlay(audioObject, onPlay); } public void Play(int audioId) @@ -126,10 +128,15 @@ namespace OCES.Audio this.m_mixer = Resources.Load("Audios/Master"); // ── SFX 调度器 ── - this.m_scheduler = gameObject.AddComponent(); + // AudioSystem.cs 中 + GameObject sfxPoolRoot = new("SfxSourcePool"); + sfxPoolRoot.transform.SetParent(transform, false); + AudioSourcePool sfxPool = new(sfxPoolRoot.transform); // 不传 mixer group,让 SfxSystem 自己设置 + this.m_sfxSystem = gameObject.AddComponent(); this.m_audioObjects = AudioConfigLoader.Load($"{k_audioConfigPath}/AudioObject"); this.m_groups = AudioConfigLoader.Load($"{k_audioConfigPath}/AudioGroup"); - this.m_scheduler.Initialize(this.m_groups, this.m_mixer); + this.m_sfxSystem.Initialize(this.m_groups, this.m_mixer, sfxPool); // 传入 pool + // ── 音乐与环境音系统 ── var segments = AudioConfigLoader.Load($"{k_audioConfigPath}/MusicSegment"); @@ -145,12 +152,12 @@ namespace OCES.Audio // AudioSourcePool 由 MusicSystem 独占一个子节点,与 SFX pool 隔离 GameObject musicPoolRoot = new("MusicSourcePool"); musicPoolRoot.transform.SetParent(transform, false); - AudioMixerGroup musicGroup = this.m_mixer.FindMatchingGroups("Master/Music")[0]; + AudioMixerGroup musicGroup = this.m_mixer.FindMatchingGroups("Master/Regular/Music")[0]; AudioSourcePool musicPool = new(musicPoolRoot.transform, musicGroup); GameObject ambiencePoolRoot = new("AmbienceSourcePool"); - musicPoolRoot.transform.SetParent(transform, false); - AudioMixerGroup ambienceGroup = this.m_mixer.FindMatchingGroups("Master/SFX/Ambience")[0]; + ambiencePoolRoot.transform.SetParent(transform, false); + AudioMixerGroup ambienceGroup = this.m_mixer.FindMatchingGroups("Master/Regular/SFX/Ambience")[0]; AudioSourcePool ambiencePool = new(ambiencePoolRoot.transform, ambienceGroup); this.m_musicSystem.Initialize( diff --git a/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs b/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs index 14cc56d..c24ea55 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs @@ -17,8 +17,8 @@ namespace OCES.Audio public enum MixingType { Sfx = 0, - Music, Voice, + Accented, } /// diff --git a/Assets/Scripts/OCES/Audio/HandWritten/AudioScheduler.cs b/Assets/Scripts/OCES/Audio/HandWritten/SfxSystem.cs similarity index 94% rename from Assets/Scripts/OCES/Audio/HandWritten/AudioScheduler.cs rename to Assets/Scripts/OCES/Audio/HandWritten/SfxSystem.cs index 379a97a..cd35e50 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/AudioScheduler.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/SfxSystem.cs @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -7,9 +8,9 @@ using UnityEngine.Audio; namespace OCES.Audio { /// - /// 音频调度器 + /// 音效系统 /// - public class AudioScheduler : MonoBehaviour + public class SfxSystem : MonoBehaviour { public UnityEngine.UI.Text audioSystemTextBox; @@ -27,8 +28,8 @@ namespace OCES.Audio AudioGroupConfig m_groupConfig; AudioMixerGroup m_sfxGroup; - AudioMixerGroup m_musicGroup; AudioMixerGroup m_voiceGroup; + AudioMixerGroup m_accentSfxGroup; AudioSourcePool m_pool; AudioContainerSelector m_containerSelector; PitchStepResolver m_pitchStepResolver; @@ -50,7 +51,9 @@ namespace OCES.Audio void IncrementClipCount(uint id) { this.m_clipConcurrentCount[id] = GetClipCount(id) + 1; +#if UNITY_EDITOR Debug.Log($"{id} count added to {GetClipCount(id)}"); +#endif } void DecrementClipCount(uint id) @@ -64,18 +67,21 @@ namespace OCES.Audio // 初始化 // ───────────────────────────────────────────── - public void Initialize(AudioGroupConfig groups, AudioMixer mixer) + public void Initialize(AudioGroupConfig groups, AudioMixer mixer, AudioSourcePool pool) { this.m_groupConfig = groups; - this.m_pool = new AudioSourcePool(transform); + this.m_pool = pool; this.m_containerSelector = new AudioContainerSelector(); this.m_pitchStepResolver = new PitchStepResolver(); - AudioMixerGroup[] sfx = Find("Master/SFX"); + AudioMixerGroup[] sfx = Find("Master/Regular/SFX"); if (sfx.Length > 0) this.m_sfxGroup = sfx[0]; - AudioMixerGroup[] voice = Find("Master/Voice"); + AudioMixerGroup[] voice = Find("Master/Regular/Voice"); if (voice.Length > 0) this.m_voiceGroup = voice[0]; + AudioMixerGroup[] accentSfx = Find("Master/SFX_Accent"); + if (accentSfx.Length > 0) this.m_accentSfxGroup = accentSfx[0]; + return; AudioMixerGroup[] Find(string path) => mixer.FindMatchingGroups(path); @@ -85,7 +91,7 @@ namespace OCES.Audio // 节流 & 调度入口 // ───────────────────────────────────────────── - internal void TryPlay(AudioObject audioObject) + internal void TryPlay(AudioObject audioObject, Action onPlay = null) { double now = Time.realtimeSinceStartupAsDouble * 1000.0; @@ -169,6 +175,7 @@ namespace OCES.Audio float pitch = this.m_pitchStepResolver.ResolvePitch(audioObject, now); //算一下用不用变调 PlayNewSound(audioObject, pitch); this.m_lastPlayTime[audioObject.Id] = now; + onPlay?.Invoke(); } // ───────────────────────────────────────────── @@ -263,6 +270,7 @@ namespace OCES.Audio yield return new WaitForSeconds(audioObject.InitialDelay); if (!this.m_activeSounds.Contains(active)) yield break; + active.Pitch = pitch; ExecutePlay(active, isRegistered: true); } @@ -312,11 +320,21 @@ namespace OCES.Audio /// AudioMixerGroup GetMixerGroup(MixingType type) => type switch { - MixingType.Music => this.m_musicGroup, MixingType.Voice => this.m_voiceGroup, - _ => this.m_sfxGroup, + MixingType.Accented => this.m_accentSfxGroup, + _ => GetDefaultGroup(type), }; + AudioMixerGroup GetDefaultGroup(MixingType type) + { + if (type != MixingType.Sfx) + { + Debug.LogWarning($"[SfxSystem] Unrecognized MixingType: {type}, defaulting to SFX."); + } + + return this.m_sfxGroup; + } + bool SetupSource(AudioSource source, AudioObject audioObject, float pitch, int clipIndex = 0) { AudioClip clip = Resources.Load($"Audios/{audioObject.Name[clipIndex]}"); // TODO 抽象同一资源加载接口 diff --git a/Assets/Scripts/OCES/Audio/HandWritten/AudioScheduler.cs.meta b/Assets/Scripts/OCES/Audio/HandWritten/SfxSystem.cs.meta similarity index 100% rename from Assets/Scripts/OCES/Audio/HandWritten/AudioScheduler.cs.meta rename to Assets/Scripts/OCES/Audio/HandWritten/SfxSystem.cs.meta