feat: Add switch container functionality

This commit is contained in:
2026-04-15 21:05:17 +08:00
parent c3eb094fdc
commit 19faccd312
57 changed files with 782 additions and 75 deletions
@@ -0,0 +1,71 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace OCES.Audio
{
public partial class AudioObjectConfig
{
Dictionary<uint, Dictionary<int, uint>> m_switchMapping;
internal void PreParseSwitchMappings()
{
this.m_switchMapping = new Dictionary<uint, Dictionary<int, uint>>();
foreach (AudioObject audioObject in AudioObjectList())
{
if (audioObject.ContainerType != ContainerType.Switch) continue;
this.m_switchMapping[audioObject.Id] = ParseSwitchMapping(audioObject);
}
}
public AudioObject GetMappingResult(uint switchContainerId, Enum enumState)
{
if (!this.m_switchMapping.TryGetValue(switchContainerId, out Dictionary<int, uint> switchMapping))
return null;
return switchMapping.TryGetValue(enumState.GetHashCode(), out uint audioObjectId) ? QueryById(audioObjectId) : null;
}
Dictionary<int, uint> ParseSwitchMapping(AudioObject switchContainer)
{
Dictionary<int, uint> switchMapping = new();
foreach (string name in switchContainer.Name)
{
string[] parts = name.Split(',');
if(parts.Length != 2)
{
Debug.LogWarning($"[AudioSystem] 无法解析 Switch Container {switchContainer.Id} 的映射关系!请检查表");
continue;
}
if (!int.TryParse(parts[0].Trim(), out int stateValue))
{
Debug.LogWarning($"[AudioSystem] 无法解析 映射关系!请查表");
continue;
}
if (!uint.TryParse(parts[1].Trim(), out uint childId))
{
Debug.LogWarning("");
continue;
}
switchMapping.Add(stateValue, childId);
}
return switchMapping;
}
internal AudioObject GetDefaultSwitchOrFallback(AudioObject switchContainer)
{
if (switchContainer.DefaultSwitchId == 0)
return null;
AudioObject defaultChildAudioObject = QueryById(switchContainer.DefaultSwitchId);
if (defaultChildAudioObject != null)
return defaultChildAudioObject;
Debug.LogWarning($"[AudioSystem] DefaultSwitch AudioObject {switchContainer.DefaultSwitchId} 不存在。");
return null;
}
}
}