refactor: 重构 Transition 查询逻辑,移除 PathId 改用 ContainerId 匹配
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user