From 7ace1f255ad8658a9a79fc5f6456180275ecc77e Mon Sep 17 00:00:00 2001 From: bottlefish <781230111@qq.com> Date: Wed, 15 Jul 2026 19:36:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(fix-system):=20=E4=BF=AE=E5=A4=8D=E7=BB=B4?= =?UTF-8?q?=E4=BF=AE=E5=9C=BA=E6=99=AF=E9=BC=A0=E6=A0=87=E8=A7=86=E5=B7=AE?= =?UTF-8?q?=E5=81=8F=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FixSystem/Effect/MouseFollowEffect.cs | 59 +++++++------------ 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/Assets/Scripts/FixSystem/Effect/MouseFollowEffect.cs b/Assets/Scripts/FixSystem/Effect/MouseFollowEffect.cs index c0d117d71..6eddc45e3 100644 --- a/Assets/Scripts/FixSystem/Effect/MouseFollowEffect.cs +++ b/Assets/Scripts/FixSystem/Effect/MouseFollowEffect.cs @@ -183,12 +183,25 @@ namespace AibisDream Vector3 worldMousePosition = cameraForInput.ScreenToWorldPoint(mousePosition); worldMousePosition.z = 0; - // 视差锚点用 initialPosition,避免相机跟随平移后 delta 被抵消 - Vector3 parallaxAnchor = UsesCinemachinePan ? initialPosition : ViewPosition; - parallaxAnchor.z = 0; - Vector3 delta = UsesCinemachinePan - ? worldMousePosition - parallaxAnchor - : parallaxAnchor - worldMousePosition; + Vector3 delta; + if (UsesCinemachinePan) + { + // 只使用鼠标相对视口中心的偏移,避免将相机自身的平移重复计入视差。 + Vector3 screenCenter = new( + cameraForInput.pixelRect.center.x, + cameraForInput.pixelRect.center.y, + mousePosition.z); + Vector3 worldScreenCenter = cameraForInput.ScreenToWorldPoint(screenCenter); + worldScreenCenter.z = 0; + delta = worldMousePosition - worldScreenCenter; + } + else + { + Vector3 parallaxAnchor = ViewPosition; + parallaxAnchor.z = 0; + delta = parallaxAnchor - worldMousePosition; + } + Vector3 targetOffset = delta * parallaxEffectMultiplier; targetOffset.x = Mathf.Clamp(targetOffset.x, -maxOffset.x, maxOffset.x); targetOffset.y = Mathf.Clamp(targetOffset.y, -maxOffset.y, maxOffset.y); @@ -198,13 +211,11 @@ namespace AibisDream Vector3 targetPosition = initialPosition + currentOffset; if (UsesCinemachinePan) { - Vector2 parallaxSlack = maxOffset * parallaxEffectMultiplier; - targetPosition = ClampFocusPositionWithSlack( + targetPosition = ClampFocusPosition( targetPosition, worldRegionMin, worldRegionMax, - GetViewportSize(), - parallaxSlack); + GetViewportSize()); } else { @@ -323,34 +334,6 @@ namespace AibisDream return new Vector2(height * cam.aspect, height); } - private static Vector3 ClampFocusPositionWithSlack( - Vector3 targetPosition, - Vector2 minBounds, - Vector2 maxBounds, - Vector2 viewportSize, - Vector2 slack) - { - if (maxBounds.x > minBounds.x) - { - float halfWidth = Mathf.Max(0f, viewportSize.x * 0.5f); - targetPosition.x = Mathf.Clamp( - targetPosition.x, - minBounds.x + halfWidth - slack.x, - maxBounds.x - halfWidth + slack.x); - } - - if (maxBounds.y > minBounds.y) - { - float halfHeight = Mathf.Max(0f, viewportSize.y * 0.5f); - targetPosition.y = Mathf.Clamp( - targetPosition.y, - minBounds.y + halfHeight - slack.y, - maxBounds.y - halfHeight + slack.y); - } - - return targetPosition; - } - private static Vector3 ClampFocusPosition(Vector3 targetPosition, Vector2 minBounds, Vector2 maxBounds, Vector2 viewportSize) { if (maxBounds.x > minBounds.x)