重构音频模块 1. 高频、大量音频反复调用时,单帧 CPU 开销与 GC 最优 2. AudioClip / AudioSource 的加载、缓存淘汰、卸载形成完整闭环,避免线性遍历 3. AudioSource 对象池 + 播放请求 struct 全部池化覆盖所有分配点 4. 支持3D环境音并具备距离衰减、遮挡等空间属性 5. 新增音频类型(BGM/SFX/Voice/Ambient) 6. 可调式监控Debug信息 及时跟踪音频缓存 处理 句柄状态
100 lines
3.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|