refactor: 重构 Transition 查询逻辑,移除 PathId 改用 ContainerId 匹配

This commit is contained in:
2026-04-28 15:30:01 +08:00
parent 2fa3fa49d7
commit 8ea862b546
13 changed files with 204 additions and 78 deletions
@@ -1,4 +1,5 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace OCES.Audio
@@ -12,6 +13,7 @@ namespace OCES.Audio
readonly AmbienceTransitionConfig m_transitionConfig;
readonly MonoBehaviour m_coroutineHost;
readonly ChannelFader m_fader;
readonly List<AmbienceTransition> m_transitionCandidates = new();
ContainerPlayHandle m_currentHandle;
Coroutine m_transitionCoroutine;
@@ -22,7 +24,7 @@ namespace OCES.Audio
internal AmbienceChannelPlayer(
AmbienceTransitionConfig transitionConfig,
MusicContainerPlayer player,
LongAudioContainerPlayer player,
MonoBehaviour coroutineHost)
{
this.m_transitionConfig = transitionConfig;
@@ -34,12 +36,12 @@ namespace OCES.Audio
// 公开接口
// ─────────────────────────────────────────────
internal void SwitchTo(uint newContainerId, uint fromPathId, uint toPathId)
internal void SwitchTo(uint newContainerId)
{
if (newContainerId == this.m_currentContainerId && this.m_currentHandle != null)
return;
AmbienceTransition transition = ResolveTransition(fromPathId, toPathId);
AmbienceTransition transition = ResolveTransition((int)this.m_currentContainerId, (int)newContainerId);
if (this.m_transitionCoroutine != null)
this.m_coroutineHost.StopCoroutine(this.m_transitionCoroutine);
@@ -93,26 +95,29 @@ namespace OCES.Audio
// 工具
// ─────────────────────────────────────────────
AmbienceTransition ResolveTransition(uint fromPathId, uint toPathId)
AmbienceTransition ResolveTransition(int sourceContainerId, int destinationContainerId)
{
// 优先精确匹配
uint exactId = fromPathId * 1000 + toPathId;
AmbienceTransition exact = this.m_transitionConfig.QueryById(exactId);
if (exact != null) return exact;
this.m_transitionCandidates.Clear();
foreach (AmbienceTransition transition in this.m_transitionConfig.AmbienceTransitionList())
{
bool sourceMatch = transition.SourceContainerID == sourceContainerId || transition.SourceContainerID < 0;
bool destMatch = transition.DestinationContainerID == destinationContainerId || transition.DestinationContainerID < 0;
if (sourceMatch && destMatch)
{
this.m_transitionCandidates.Add(transition);
}
}
// From 为任意
uint fromWildcard = 999u * 1000 + toPathId;
AmbienceTransition fromWild = this.m_transitionConfig.QueryById(fromWildcard);
if (fromWild != null) return fromWild;
if (this.m_transitionCandidates.Count == 0)
return this.m_transitionConfig.QueryById(1);
// To 为任意
uint toWildcard = fromPathId * 1000 + 999u;
AmbienceTransition toWild = this.m_transitionConfig.QueryById(toWildcard);
if (toWild != null) return toWild;
// 全通配
const uint allWild = 999u * 1000 + 999u;
return this.m_transitionConfig.QueryById(allWild);
AmbienceTransition best = this.m_transitionCandidates[0];
for (int i = 1; i < this.m_transitionCandidates.Count; i++)
{
if (this.m_transitionCandidates[i].Id > best.Id)
best = this.m_transitionCandidates[i];
}
return best;
}
}
}