From 0137d5427124d9a6e804f0d0fba6dfcce2f1228c Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Tue, 21 Apr 2026 14:11:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(scene-mgmt):=20=E4=BF=AE=E5=A4=8D=E7=9B=B8?= =?UTF-8?q?=E6=9C=BA=E5=88=87=E6=8D=A2=20blend=20=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/Framework/OtherKit/CameraKit.cs | 38 ++++++++++++++++++- .../SceneCenter/SubwayCenter.cs | 2 +- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/Assets/Scripts/Framework/OtherKit/CameraKit.cs b/Assets/Scripts/Framework/OtherKit/CameraKit.cs index 09efc26e6..6b24610d8 100644 --- a/Assets/Scripts/Framework/OtherKit/CameraKit.cs +++ b/Assets/Scripts/Framework/OtherKit/CameraKit.cs @@ -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() diff --git a/Assets/Scripts/SceneManagement/SceneCenter/SubwayCenter.cs b/Assets/Scripts/SceneManagement/SceneCenter/SubwayCenter.cs index e3ddb5a41..319242159 100644 --- a/Assets/Scripts/SceneManagement/SceneCenter/SubwayCenter.cs +++ b/Assets/Scripts/SceneManagement/SceneCenter/SubwayCenter.cs @@ -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()); } }