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
@@ -9,8 +9,10 @@ namespace OCES.Audio
/// </summary>
public class MusicStateRouter
{
// key: StateGroup enum Typevalue: 当前激活的 enum 整数值
readonly Dictionary<Type, int> m_activeStates = new();
// key: StateGroup enum Typevalue: 当前激活的 enum 值
readonly Dictionary<Type, Enum> m_activeStates = new();
readonly MusicPathConfig m_musicPaths;
readonly AmbiencePathConfig m_ambiencePaths;
@@ -18,6 +20,7 @@ namespace OCES.Audio
// 上一次匹配到的 PathId,用于 Transition 表的 FromPathId 查询
public uint LastMusicPathId { get; private set; }
public uint LastAmbiencePathId { get; private set; }
internal IReadOnlyDictionary<Type, Enum> ActiveStates { get { return this.m_activeStates; }}
public MusicStateRouter(MusicPathConfig musicPaths, AmbiencePathConfig ambiencePaths)
{
@@ -31,8 +34,8 @@ namespace OCES.Audio
public void SetState<TEnum>(TEnum state, out uint musicContainerId, out uint ambienceContainerId)
where TEnum : Enum
{
// Dictionary<Type, int> 天然保证同一 StateGroup 只保留最新值,直接覆盖即可
this.m_activeStates[typeof(TEnum)] = Convert.ToInt32(state);
// Dictionary<Type, Enum> 天然保证同一 StateGroup 只保留最新值,直接覆盖即可
this.m_activeStates[typeof(TEnum)] = state;
musicContainerId = MatchBestPath(this.m_musicPaths.MusicPathList(), out uint musicPathId);
ambienceContainerId = MatchBestPath(this.m_ambiencePaths.AmbiencePathList(), out uint ambiencePathId);
@@ -99,9 +102,9 @@ namespace OCES.Audio
}
bool conditionMet = false;
foreach (KeyValuePair<Type, int> kv in this.m_activeStates)
foreach (KeyValuePair<Type, Enum> kv in this.m_activeStates)
{
if (StateGroupRegistry.GetTypeId(kv.Key) != typeId || kv.Value != stateValue)
if (StateGroupRegistry.GetTypeId(kv.Key) != typeId || Convert.ToInt32(kv.Value) != stateValue)
continue;
conditionMet = true;
break;