diff --git a/Packages/com.unity.inputsystem/CHANGELOG.md b/Packages/com.unity.inputsystem/CHANGELOG.md index 7570433300..6f4daef3c0 100644 --- a/Packages/com.unity.inputsystem/CHANGELOG.md +++ b/Packages/com.unity.inputsystem/CHANGELOG.md @@ -19,6 +19,7 @@ however, it has to be formatted properly to pass verification tests. - Fixed warnings being generated on Unity 6.4 and 6.5. (ISX-2395). - Fixed extra empty lines being displayed in the control binding list when mouse buttons are pressed [ISXB-1677](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-1677) - Fixed InputActionReference not being set when attempting to set it on a Prefab or ScriptableObject [ISXB-1787](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-1787) +- Fixed misaligned Virtual Cursor when changing resolution [ISXB-1119](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-1119) ### Changed diff --git a/Packages/com.unity.inputsystem/InputSystem/Plugins/UI/VirtualMouseInput.cs b/Packages/com.unity.inputsystem/InputSystem/Plugins/UI/VirtualMouseInput.cs index cb8aea5535..5a3c39a8f8 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Plugins/UI/VirtualMouseInput.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Plugins/UI/VirtualMouseInput.cs @@ -14,8 +14,6 @@ ////TODO: add support for acceleration -////TODO: automatically scale mouse speed to resolution such that it stays constant regardless of resolution - ////TODO: make it work with PlayerInput such that it will automatically look up actions in the actual PlayerInput instance it is used with (based on the action IDs it has) ////REVIEW: should we default the SW cursor position to the center of the screen? @@ -291,7 +289,10 @@ protected void OnEnable() // Add mouse device. if (m_VirtualMouse == null) + { m_VirtualMouse = (Mouse)InputSystem.AddDevice("VirtualMouse"); + TryFindCanvas(); + } else if (!m_VirtualMouse.added) InputSystem.AddDevice(m_VirtualMouse); @@ -370,6 +371,7 @@ protected void OnDisable() private void TryFindCanvas() { m_Canvas = m_CursorGraphic?.GetComponentInParent(); + m_CanvasScaler = m_CursorGraphic?.GetComponentInParent(); } private void TryEnableHardwareCursor() @@ -421,6 +423,14 @@ private void UpdateMotion() } else { + var resolutionXScale = 1f; + var resolutionYScale = 1f; + if (m_CanvasScaler != null) + { + resolutionXScale = m_Canvas.pixelRect.xMax / m_CanvasScaler.referenceResolution.x; + resolutionYScale = m_Canvas.pixelRect.yMax / m_CanvasScaler.referenceResolution.y; + } + var currentTime = InputState.currentTime; if (Mathf.Approximately(0, m_LastStickValue.x) && Mathf.Approximately(0, m_LastStickValue.y)) { @@ -430,7 +440,7 @@ private void UpdateMotion() // Compute delta. var deltaTime = (float)(currentTime - m_LastTime); - var delta = new Vector2(m_CursorSpeed * stickValue.x * deltaTime, m_CursorSpeed * stickValue.y * deltaTime); + var delta = new Vector2(m_CursorSpeed * resolutionXScale * stickValue.x * deltaTime, m_CursorSpeed * resolutionYScale * stickValue.y * deltaTime); // Update position. var currentPosition = m_VirtualMouse.position.value; @@ -454,7 +464,9 @@ private void UpdateMotion() if (m_CursorTransform != null && (m_CursorMode == CursorMode.SoftwareCursor || (m_CursorMode == CursorMode.HardwareCursorIfAvailable && m_SystemMouse == null))) - m_CursorTransform.anchoredPosition = newPosition; + { + m_CursorTransform.anchoredPosition = m_CanvasScaler == null ? newPosition : new Vector2(newPosition.x / resolutionXScale, newPosition.y / resolutionYScale); + } m_LastStickValue = stickValue; m_LastTime = currentTime; @@ -508,6 +520,7 @@ private void UpdateMotion() [SerializeField] private InputActionProperty m_ScrollWheelAction; private Canvas m_Canvas; // Canvas that gives the motion range for the software cursor. + private CanvasScaler m_CanvasScaler; private Mouse m_VirtualMouse; private Mouse m_SystemMouse; private Action m_AfterInputUpdateDelegate;