com.alicizax.unity.framework/Runtime/Audio/AudioGroupConfigCollection.cs
陈思海 46194ddee8 重构音频模块 1. 高频、大量音频反复调用时,单帧 CPU 开销与 GC 最优 2. AudioClip / AudioSource 的加载、缓存淘汰、卸载形成完整闭环,避免线性遍历 3. AudioSource 对象池 + 播放请求 struct 全部池化覆盖所有分配点 4. 支持3D环境音并具备距离衰减、遮挡等空间属性 5. 新增音频类型(BGM/SFX/Voice/Ambient) 6. 可调式监控Debug信息 及时跟踪音频缓存 处理 句柄状态
重构音频模块
1. 高频、大量音频反复调用时,单帧 CPU 开销与 GC 最优
2. AudioClip / AudioSource 的加载、缓存淘汰、卸载形成完整闭环,避免线性遍历
3. AudioSource 对象池 + 播放请求 struct 全部池化覆盖所有分配点
4. 支持3D环境音并具备距离衰减、遮挡等空间属性
5. 新增音频类型(BGM/SFX/Voice/Ambient)
6. 可调式监控Debug信息 及时跟踪音频缓存 处理 句柄状态
2026-04-23 17:21:36 +08:00

100 lines
3.4 KiB
C#

using System;
using UnityEngine;
namespace AlicizaX.Audio.Runtime
{
[CreateAssetMenu(fileName = "AudioGroupConfigs", menuName = "AlicizaX/Audio/Audio Group Configs", order = 40)]
public sealed class AudioGroupConfigCollection : ScriptableObject
{
[SerializeField] private AudioGroupConfig[] m_GroupConfigs = CreateDefaultConfigs();
public AudioGroupConfig[] GroupConfigs => m_GroupConfigs;
public void EnsureDefaults()
{
if (m_GroupConfigs == null || m_GroupConfigs.Length == 0)
{
m_GroupConfigs = CreateDefaultConfigs();
return;
}
bool[] found = new bool[(int)AudioType.Max];
int validCount = 0;
for (int i = 0; i < m_GroupConfigs.Length; i++)
{
AudioGroupConfig config = m_GroupConfigs[i];
if (config == null)
{
continue;
}
int index = (int)config.AudioType;
if ((uint)index >= (uint)found.Length || found[index])
{
continue;
}
found[index] = true;
validCount++;
}
if (validCount == (int)AudioType.Max)
{
return;
}
AudioGroupConfig[] defaults = CreateDefaultConfigs();
AudioGroupConfig[] merged = new AudioGroupConfig[(int)AudioType.Max];
for (int i = 0; i < m_GroupConfigs.Length; i++)
{
AudioGroupConfig config = m_GroupConfigs[i];
if (config == null)
{
continue;
}
int index = (int)config.AudioType;
if ((uint)index < (uint)merged.Length && merged[index] == null)
{
merged[index] = config;
}
}
for (int i = 0; i < merged.Length; i++)
{
if (merged[i] == null)
{
merged[i] = defaults[i];
}
}
m_GroupConfigs = merged;
}
#if UNITY_EDITOR
private void OnValidate()
{
EnsureDefaults();
}
#endif
internal static AudioGroupConfig[] CreateDefaultConfigs()
{
AudioGroupConfig[] configs = new AudioGroupConfig[(int)AudioType.Max];
configs[(int)AudioType.Music] = CreateConfig(AudioType.Music, "音乐", "MusicVolume", 2, 0f, false);
configs[(int)AudioType.Sound] = CreateConfig(AudioType.Sound, "音效", "SoundVolume", 24, 1f, false);
configs[(int)AudioType.UISound] = CreateConfig(AudioType.UISound, "界面音效", "UISoundVolume", 12, 0f, false);
configs[(int)AudioType.Voice] = CreateConfig(AudioType.Voice, "语音", "VoiceVolume", 6, 1f, true);
configs[(int)AudioType.Ambient] = CreateConfig(AudioType.Ambient, "环境音", "AmbientVolume", 6, 1f, true);
return configs;
}
private static AudioGroupConfig CreateConfig(AudioType type, string name, string exposedVolumeParameter, int channelCount, float spatialBlend, bool occlusion)
{
AudioGroupConfig config = new AudioGroupConfig();
config.SetDefaults(type, name, exposedVolumeParameter, channelCount, spatialBlend, occlusion);
return config;
}
}
}