feat: 重构音频系统 - 重命名AudioScheduler为SfxSystem并添加Accented音效类型

- 将AudioScheduler重命名为SfxSystem,统一命名规范
- 新增MixingType.Accented音效类型,支持强调音效独立混音
- 重构音频混合器层级: Master下新增Regular中间层
- SfxSystem使用外部AudioSourcePool,与MusicSystem隔离
- 修复ambiencePoolRoot父节点错误(原错误挂载到musicPoolRoot)
- Play方法支持onPlay回调
- 同步更新AudioObject.bytes二进制配置数据
This commit is contained in:
2026-04-03 11:53:15 +08:00
parent 89c024e781
commit a4f2eb645a
9 changed files with 173 additions and 35 deletions
@@ -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<AudioMixer>("Audios/Master");
// ── SFX 调度器 ──
this.m_scheduler = gameObject.AddComponent<AudioScheduler>();
// AudioSystem.cs 中
GameObject sfxPoolRoot = new("SfxSourcePool");
sfxPoolRoot.transform.SetParent(transform, false);
AudioSourcePool sfxPool = new(sfxPoolRoot.transform); // 不传 mixer group,让 SfxSystem 自己设置
this.m_sfxSystem = gameObject.AddComponent<SfxSystem>();
this.m_audioObjects = AudioConfigLoader.Load<AudioObjectConfig>($"{k_audioConfigPath}/AudioObject");
this.m_groups = AudioConfigLoader.Load<AudioGroupConfig>($"{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<MusicSegmentConfig>($"{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(