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()); } }