From 062d8ce5b5b06e9fb453801b6c18f25d86442993 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 6 Jul 2021 17:36:58 +0200 Subject: [PATCH 1/2] Fix camera rotation uncontrollable with low framerate. --- .../Runtime/Camera/FreeCamera.cs | 14 +++++++------- .../SampleSceneAssets/Scripts/LookWithMouse.cs | 10 ++++++---- .../Scripts/SimpleCameraController.cs | 8 ++++---- .../Assets/Scripts/SimpleCameraController.cs | 17 +++++++++++++---- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/com.unity.render-pipelines.core/Runtime/Camera/FreeCamera.cs b/com.unity.render-pipelines.core/Runtime/Camera/FreeCamera.cs index 8504387eeaa..3c37b7a6175 100644 --- a/com.unity.render-pipelines.core/Runtime/Camera/FreeCamera.cs +++ b/com.unity.render-pipelines.core/Runtime/Camera/FreeCamera.cs @@ -14,6 +14,8 @@ namespace UnityEngine.Rendering [CoreRPHelpURLAttribute("Free-Camera")] public class FreeCamera : MonoBehaviour { + const float k_MouseSensitivityMultiplier = 0.01f; + /// /// Rotation speed when using a controller. /// @@ -21,7 +23,7 @@ public class FreeCamera : MonoBehaviour /// /// Rotation speed when using the mouse. /// - public float m_LookSpeedMouse = 10.0f; + public float m_LookSpeedMouse = 4.0f; /// /// Movement speed. /// @@ -51,7 +53,6 @@ public class FreeCamera : MonoBehaviour InputAction lookAction; InputAction moveAction; InputAction speedAction; - InputAction fireAction; InputAction yMoveAction; #endif @@ -94,7 +95,6 @@ void RegisterInputs() moveAction.Enable(); lookAction.Enable(); speedAction.Enable(); - fireAction.Enable(); yMoveAction.Enable(); #endif @@ -129,8 +129,8 @@ void UpdateInputs() #if USE_INPUT_SYSTEM var lookDelta = lookAction.ReadValue(); - inputRotateAxisX = lookDelta.x * m_LookSpeedMouse * Time.deltaTime; - inputRotateAxisY = lookDelta.y * m_LookSpeedMouse * Time.deltaTime; + inputRotateAxisX = lookDelta.x * m_LookSpeedMouse * k_MouseSensitivityMultiplier; + inputRotateAxisY = lookDelta.y * m_LookSpeedMouse * k_MouseSensitivityMultiplier; leftShift = Keyboard.current.leftShiftKey.isPressed; fire1 = Mouse.current?.leftButton?.isPressed == true || Gamepad.current?.xButton?.isPressed == true; @@ -148,8 +148,8 @@ void UpdateInputs() inputRotateAxisX = Input.GetAxis(kMouseX) * m_LookSpeedMouse; inputRotateAxisY = Input.GetAxis(kMouseY) * m_LookSpeedMouse; } - inputRotateAxisX += (Input.GetAxis(kRightStickX) * m_LookSpeedController * Time.deltaTime); - inputRotateAxisY += (Input.GetAxis(kRightStickY) * m_LookSpeedController * Time.deltaTime); + inputRotateAxisX += (Input.GetAxis(kRightStickX) * m_LookSpeedController * k_MouseSensitivityMultiplier); + inputRotateAxisY += (Input.GetAxis(kRightStickY) * m_LookSpeedController * k_MouseSensitivityMultiplier); leftShift = Input.GetKey(KeyCode.LeftShift); fire1 = Input.GetAxis("Fire1") > 0.0f; diff --git a/com.unity.template-hd/Assets/SampleSceneAssets/Scripts/LookWithMouse.cs b/com.unity.template-hd/Assets/SampleSceneAssets/Scripts/LookWithMouse.cs index 417522f8083..2aabbd014f9 100644 --- a/com.unity.template-hd/Assets/SampleSceneAssets/Scripts/LookWithMouse.cs +++ b/com.unity.template-hd/Assets/SampleSceneAssets/Scripts/LookWithMouse.cs @@ -8,6 +8,8 @@ public class LookWithMouse : MonoBehaviour { + const float k_MouseSensitivityMultiplier = 0.01f; + public float mouseSensitivity = 100f; public Transform playerBody; @@ -39,11 +41,11 @@ void Update() mouseY += value.y; } - mouseX *= mouseSensitivity * Time.deltaTime; - mouseY *= mouseSensitivity * Time.deltaTime; + mouseX *= mouseSensitivity * k_MouseSensitivityMultiplier; + mouseY *= mouseSensitivity * k_MouseSensitivityMultiplier; #else - float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime; - float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime; + float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * k_MouseSensitivityMultiplier; + float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * k_MouseSensitivityMultiplier; #endif xRotation -= mouseY; diff --git a/com.unity.template-hd/Assets/SampleSceneAssets/Scripts/SimpleCameraController.cs b/com.unity.template-hd/Assets/SampleSceneAssets/Scripts/SimpleCameraController.cs index 5bb58871577..cc156229ed7 100644 --- a/com.unity.template-hd/Assets/SampleSceneAssets/Scripts/SimpleCameraController.cs +++ b/com.unity.template-hd/Assets/SampleSceneAssets/Scripts/SimpleCameraController.cs @@ -54,6 +54,8 @@ public void UpdateTransform(Transform t) } } + const float k_MouseSensitivityMultiplier = 0.01f; + CameraState m_TargetCameraState = new CameraState(); CameraState m_InterpolatingCameraState = new CameraState(); @@ -165,8 +167,6 @@ Vector3 GetInputTranslationDirection() void Update() { - // Exit Sample - if (IsEscapePressed()) { Application.Quit(); @@ -191,7 +191,7 @@ void Update() // Rotation if (IsCameraRotationAllowed()) { - var mouseMovement = GetInputLookRotation() * Time.deltaTime * mouseSensitivity; + var mouseMovement = GetInputLookRotation() * k_MouseSensitivityMultiplier * mouseSensitivity; if (invertY) mouseMovement.y = -mouseMovement.y; @@ -243,7 +243,7 @@ Vector2 GetInputLookRotation() delta *= 0.1f; // Account for sensitivity setting on old Mouse X and Y axes. return delta; #else - return new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y") * (invertY ? 1 : -1)); + return new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); #endif } diff --git a/com.unity.template-universal/Assets/Scripts/SimpleCameraController.cs b/com.unity.template-universal/Assets/Scripts/SimpleCameraController.cs index 0d788d77806..5e87216df31 100644 --- a/com.unity.template-universal/Assets/Scripts/SimpleCameraController.cs +++ b/com.unity.template-universal/Assets/Scripts/SimpleCameraController.cs @@ -54,6 +54,8 @@ public void UpdateTransform(Transform t) } } + const float k_MouseSensitivityMultiplier = 0.01f; + CameraState m_TargetCameraState = new CameraState(); CameraState m_InterpolatingCameraState = new CameraState(); @@ -65,6 +67,9 @@ public void UpdateTransform(Transform t) public float positionLerpTime = 0.2f; [Header("Rotation Settings")] + [Tooltip("Multiplier for the sensitivity of the rotation.")] + public float mouseSensitivity = 60.0f; + [Tooltip("X = Change in mouse position.\nY = Multiplicative factor for camera rotation.")] public AnimationCurve mouseSensitivityCurve = new AnimationCurve(new Keyframe(0f, 0.5f, 0f, 5f), new Keyframe(1f, 2.5f, 0f, 0f)); @@ -188,7 +193,7 @@ void Update() // Rotation if (IsCameraRotationAllowed()) { - var mouseMovement = GetInputLookRotation() * Time.deltaTime * 5; + var mouseMovement = GetInputLookRotation() * k_MouseSensitivityMultiplier * mouseSensitivity; if (invertY) mouseMovement.y = -mouseMovement.y; @@ -227,16 +232,20 @@ float GetBoostFactor() #if ENABLE_INPUT_SYSTEM return boostFactorAction.ReadValue().y * 0.01f; #else - return Input.mouseScrollDelta.y * 0.2f; + return Input.mouseScrollDelta.y * 0.01f; #endif } Vector2 GetInputLookRotation() { + // try to compensate the diff between the two input systems by multiplying with empirical values #if ENABLE_INPUT_SYSTEM - return lookAction.ReadValue(); + var delta = lookAction.ReadValue(); + delta *= 0.5f; // Account for scaling applied directly in Windows code by old input system. + delta *= 0.1f; // Account for sensitivity setting on old Mouse X and Y axes. + return delta; #else - return new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")) * 10; + return new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); #endif } From 00eb57f57bdcfceef61ea37c4ac146acd6dbb21b Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 6 Jul 2021 17:43:30 +0200 Subject: [PATCH 2/2] updated changelog --- com.unity.render-pipelines.high-definition/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.render-pipelines.high-definition/CHANGELOG.md b/com.unity.render-pipelines.high-definition/CHANGELOG.md index d35612eb54d..5effb85a713 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -271,6 +271,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Fixed custom pass volume not executed in scene view because of the volume culling mask. - Fixed remapping of depth pyramid debug view - Fixed an issue with asymmetric projection matrices and fog / pathtracing. (case 1330290). +- Fixed the FreeCamera and SimpleCameraController mouse rotation unusable at low framerate (case 1340344). ### Changed - Changed Window/Render Pipeline/HD Render Pipeline Wizard to Window/Rendering/HDRP Wizard