From 07469e09f06bbc6f9860f5c4f696035c8ee90114 Mon Sep 17 00:00:00 2001 From: Adrian Paschkowski <git@wasdennnoch.me> Date: Fri, 9 Apr 2021 21:58:27 +0200 Subject: [PATCH] Simplify cam pos interpolator handling --- Assets/Scenes/Forest.unity | 4 +-- Assets/Scripts/BaseCameraController.cs | 40 +++++++++++++++----------- Assets/Scripts/Interpolator.cs | 7 +++++ 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/Assets/Scenes/Forest.unity b/Assets/Scenes/Forest.unity index 80e03cb..215ab3e 100644 --- a/Assets/Scenes/Forest.unity +++ b/Assets/Scenes/Forest.unity @@ -441,8 +441,8 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: allowUserControl: 1 - inputVelocity: 2.5 - moveSpeed: 10 + inputVelocity: 0.5 + inputDampening: 0.1 edgeDetectionBoxInsets: {x: 0.1, y: 0.1} maxZoom: 5 minZoom: 1.5 diff --git a/Assets/Scripts/BaseCameraController.cs b/Assets/Scripts/BaseCameraController.cs index efbc50b..0c8b3d2 100644 --- a/Assets/Scripts/BaseCameraController.cs +++ b/Assets/Scripts/BaseCameraController.cs @@ -9,7 +9,7 @@ public class BaseCameraController : MonoBehaviour [Header("Movement")] [SerializeField] float inputVelocity = 2f; - [SerializeField] float moveSpeed = 10f; + [SerializeField] float inputDampening = .1f; [SerializeField] Vector2 edgeDetectionBoxInsets = new Vector2(0.1f, 0.1f); [Header("Zoom")] @@ -26,6 +26,8 @@ public class BaseCameraController : MonoBehaviour InsetCameraEdges mouseMovementEdges; bool waitForMouseOutsideEdges = false; LayeredInterpolator zoomInterpolator; + Interpolator xInputInterpolator; + Interpolator yInputInterpolator; LayeredInterpolator xPositionInterpolator; LayeredInterpolator yPositionInterpolator; Vector2 inputVector; @@ -60,8 +62,10 @@ public class BaseCameraController : MonoBehaviour mouseMovementEdges = new InsetCameraEdges(camera, edgeDetectionBoxInsets); zoomInterpolator = new LayeredInterpolator(new Interpolator(1 / zoomSpeed, camera.orthographicSize, camera.orthographicSize, minZoom, maxZoom)); - xPositionInterpolator = new LayeredInterpolator(new Interpolator(1 / moveSpeed, transform.position.x)); - yPositionInterpolator = new LayeredInterpolator(new Interpolator(1 / moveSpeed, transform.position.y)); + xInputInterpolator = new Interpolator(inputDampening); + yInputInterpolator = new Interpolator(inputDampening); + xPositionInterpolator = new LayeredInterpolator(new Interpolator(inputDampening, transform.position.x)); + yPositionInterpolator = new LayeredInterpolator(new Interpolator(inputDampening, transform.position.y)); UpdateColliderSize(); } @@ -74,7 +78,7 @@ public class BaseCameraController : MonoBehaviour } - var inputZoomDelta = (allowUserControl && !zoomInterpolator.hasLayers) ? Input.mouseScrollDelta.y * -zoomStepSize : 0; + var inputZoomDelta = IsUserControlEnabled() ? Input.mouseScrollDelta.y * -zoomStepSize : 0; if (inputZoomDelta != 0) { zoomInterpolator.targetValue += inputZoomDelta; @@ -91,7 +95,7 @@ public class BaseCameraController : MonoBehaviour waitForMouseOutsideEdges = true; } mouseMovementEdges.DrawDebug(waitForMouseOutsideEdges ? Color.red : Color.green); - var mouseViewportPos = allowUserControl ? camera.ScreenToViewportPoint(Input.mousePosition) : new Vector3(0.5f, 0.5f); + var mouseViewportPos = IsUserControlEnabled() ? camera.ScreenToViewportPoint(Input.mousePosition) : new Vector3(0.5f, 0.5f); var mouseInputVector = mouseMovementEdges.GetOutOfBoundsDirection(mouseViewportPos); if (waitForMouseOutsideEdges && mouseInputVector.magnitude == 0) { @@ -101,25 +105,29 @@ public class BaseCameraController : MonoBehaviour { inputVector = mouseInputVector; } + xInputInterpolator.targetValue = inputVector.x * zoomRatio * inputVelocity; + yInputInterpolator.targetValue = inputVector.y * zoomRatio * inputVelocity; } void FixedUpdate() { xPositionInterpolator.currentValue = rigidbody.position.x; yPositionInterpolator.currentValue = rigidbody.position.y; - if (allowUserControl && !xPositionInterpolator.hasLayers && !yPositionInterpolator.hasLayers) + var overrideInput = xPositionInterpolator.hasLayers || yPositionInterpolator.hasLayers; + var targetPos = overrideInput ? + new Vector3(xPositionInterpolator.Tick(), yPositionInterpolator.Tick()) : + transform.position + new Vector3(xInputInterpolator.Tick(), yInputInterpolator.Tick()); + rigidbody.MovePosition(targetPos); + if (overrideInput) { - if (inputVector.x != 0) - { - xPositionInterpolator.targetValue = rigidbody.position.x + inputVector.x * zoomRatio * inputVelocity; - } - if (inputVector.y != 0) - { - yPositionInterpolator.targetValue = rigidbody.position.y + inputVector.y * zoomRatio * inputVelocity; - } + xInputInterpolator.Reset(); + yInputInterpolator.Reset(); } - var targetPos = new Vector3(xPositionInterpolator.Tick(), yPositionInterpolator.Tick()); - rigidbody.MovePosition(targetPos); + } + + bool IsUserControlEnabled() + { + return allowUserControl && !zoomInterpolator.hasLayers && !xPositionInterpolator.hasLayers && !yPositionInterpolator.hasLayers; } void UpdateColliderSize() diff --git a/Assets/Scripts/Interpolator.cs b/Assets/Scripts/Interpolator.cs index 5e14bd4..13dd784 100644 --- a/Assets/Scripts/Interpolator.cs +++ b/Assets/Scripts/Interpolator.cs @@ -56,6 +56,13 @@ public class Interpolator return currentValue; } + public void Reset() + { + velocity = 0; + currentValue = 0; + targetValue = 0; + } + public override string ToString() => $"Interpolator{{ Running: {running} Duration: {duration} Current Value: {currentValue} Target Value: {targetValue} Velocity: {velocity} }}"; } -- GitLab