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; } } }