From b961785460bbb2f3c0e5993833309cebdc44ec26 Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Mon, 21 Sep 2026 15:38:02 +0200 Subject: [PATCH] Fix virtual cursor "jumping" after disabling/reenabling when a canvas scaler is applied by also applying the scaling on enable --- .../Runtime/Plugins/UI/VirtualMouseInput.cs | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Runtime/Plugins/UI/VirtualMouseInput.cs b/Packages/com.unity.inputsystem/InputSystem/Runtime/Plugins/UI/VirtualMouseInput.cs index 3cf630498e..51192fafdb 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Runtime/Plugins/UI/VirtualMouseInput.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Runtime/Plugins/UI/VirtualMouseInput.cs @@ -278,6 +278,23 @@ public InputActionProperty scrollWheelAction set => SetAction(ref m_ScrollWheelAction, value); } + // calculate the scale factor for the applied canvas scaler + private Vector2 canvasScale + { + get + { + var resolutionXScale = 1f; + var resolutionYScale = 1f; + if (m_Canvas != null && m_CanvasScaler != null) + { + resolutionXScale = m_Canvas.pixelRect.xMax / m_CanvasScaler.referenceResolution.x; + resolutionYScale = m_Canvas.pixelRect.yMax / m_CanvasScaler.referenceResolution.y; + } + + return new Vector2(resolutionXScale, resolutionYScale); + } + } + protected void OnEnable() { // Hijack system mouse, if enabled. @@ -296,7 +313,7 @@ protected void OnEnable() // Set initial cursor position. if (m_CursorTransform != null) { - var position = m_CursorTransform.anchoredPosition; + var position = AnchoredPositionToScreen(m_CursorTransform.anchoredPosition); InputState.Change(m_VirtualMouse.position, position); m_SystemMouse?.WarpCursorPosition(position); } @@ -462,7 +479,7 @@ private void UpdateMotion() (m_CursorMode == CursorMode.SoftwareCursor || (m_CursorMode == CursorMode.HardwareCursorIfAvailable && m_SystemMouse == null))) { - m_CursorTransform.anchoredPosition = m_CanvasScaler == null ? newPosition : new Vector2(newPosition.x / resolutionXScale, newPosition.y / resolutionYScale); + m_CursorTransform.anchoredPosition = ScreenPositionToAnchored(newPosition); } m_LastStickValue = stickValue; @@ -601,6 +618,20 @@ private void OnAfterInputUpdate() UpdateMotion(); } + // convert to anchored position applying canvas scaling + private Vector2 ScreenPositionToAnchored(Vector2 canvasPosition) + { + var scale = canvasScale; + return new Vector2(canvasPosition.x / scale.x, canvasPosition.y / scale.y); + } + + // convert to screen position applying canvas scaling + private Vector2 AnchoredPositionToScreen(Vector2 anchoredPosition) + { + var scale = canvasScale; + return new Vector2(anchoredPosition.x * scale.x, anchoredPosition.y * scale.y); + } + /// /// Determines how the cursor for the virtual mouse is represented. ///