fix(scene-mgmt): 修复相机切换 blend 时间计算

This commit is contained in:
2026-04-21 14:11:08 +08:00
parent 487ee0a991
commit 0137d54271
2 changed files with 37 additions and 3 deletions
+36 -2
View File
@@ -156,6 +156,12 @@ namespace AibisDream.Framework
{
yield return new WaitForSeconds(switchDuration);
}
else
{
// 至少等待两帧,确保相机切换完成
yield return null;
yield return null;
}
}
private float SwitchCameraSync(CameraEnum camType, bool immediate = false)
@@ -181,6 +187,9 @@ namespace AibisDream.Framework
CinemachineBlendDefinition.Style.Cut, 0f);
}
_virtualCameraDict.TryGetValue(_curCameraEnum, out var fromVCam);
var toVCam = _virtualCameraDict[camType];
// 设置虚拟相机优先级
foreach (var camPair in _virtualCameraDict)
{
@@ -199,9 +208,34 @@ namespace AibisDream.Framework
return 0f;
}
ActionKit.Delay(activeBrain.m_DefaultBlend.BlendTime, () => ResetVirCam(lastCamEnum)).StartGlobal();
// CinemachineBrain.LookupBlend 在 2.x 中是 private,这里重写其等价逻辑:
// Custom Blends 资产里有匹配项就用它,否则回退到 Default Blend。
var blendTime = ResolveBlendTime(activeBrain, fromVCam, toVCam);
ActionKit.Delay(blendTime, () => ResetVirCam(lastCamEnum)).StartGlobal();
return activeBrain.m_DefaultBlend.BlendTime;
return blendTime;
}
private static float ResolveBlendTime(
CinemachineBrain brain,
ICinemachineCamera fromCam,
ICinemachineCamera toCam)
{
var blend = brain.m_DefaultBlend;
if (brain.m_CustomBlends != null)
{
var fromName = fromCam != null ? fromCam.Name : string.Empty;
var toName = toCam != null ? toCam.Name : string.Empty;
blend = brain.m_CustomBlends.GetBlendForVirtualCameras(fromName, toName, blend);
}
if (CinemachineCore.GetBlendOverride != null)
{
blend = CinemachineCore.GetBlendOverride(fromCam, toCam, blend, brain);
}
return blend.BlendTime;
}
public void ResetCamera()
@@ -95,7 +95,7 @@ namespace AibisDream
public IEnumerator Enter()
{
yield return CameraKit.Instance.SwitchCamera(CameraEnum.Subway, true);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.Subway);
DialogUIManager.Instance.LoadBubbles(SubwayCenter.Instance.subwaySlots.CollectData());
}
}