From f2ff74d3653a611a187faaa153931bef2af0a6ac Mon Sep 17 00:00:00 2001
From: wasdennnoch <leiter04@gmail.com>
Date: Fri, 2 Apr 2021 22:23:51 +0200
Subject: [PATCH] Interpolate mouse-based camera movement

---
 Assets/Scenes/Forest.unity             |  2 +-
 Assets/Scripts/BaseCameraController.cs | 18 +++++++++++++-----
 Assets/Scripts/Interpolator.cs         |  8 ++++++--
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/Assets/Scenes/Forest.unity b/Assets/Scenes/Forest.unity
index 72c2749..cf5f6f6 100644
--- a/Assets/Scenes/Forest.unity
+++ b/Assets/Scenes/Forest.unity
@@ -445,7 +445,7 @@ MonoBehaviour:
   maxZoom: 5
   minZoom: 1.5
   zoomStepSize: 1
-  zoomDuration: 0.1
+  zoomSpeed: 10
 --- !u!61 &1276077110
 BoxCollider2D:
   m_ObjectHideFlags: 0
diff --git a/Assets/Scripts/BaseCameraController.cs b/Assets/Scripts/BaseCameraController.cs
index 6d8ff04..f1f9736 100644
--- a/Assets/Scripts/BaseCameraController.cs
+++ b/Assets/Scripts/BaseCameraController.cs
@@ -13,7 +13,7 @@ public class BaseCameraController : MonoBehaviour
     [SerializeField] float maxZoom = 5f;
     [SerializeField] float minZoom = 1.5f;
     [SerializeField] float zoomStepSize = 1f;
-    [SerializeField] float zoomDuration = 0.1f;
+    [SerializeField] float zoomSpeed = 10f;
 
     new Camera camera;
     new AudioSource audio;
@@ -21,11 +21,13 @@ public class BaseCameraController : MonoBehaviour
     new Rigidbody2D rigidbody;
 
     Interpolator zoomInterpolator;
+    Interpolator moveXInterpolator;
+    Interpolator moveYInterpolator;
+    Vector3 inputVector = Vector3.zero;
     float zoomRatio
     {
         get => camera.orthographicSize / maxZoom;
     }
-    Vector3 inputVector = Vector3.zero;
 
     void Awake()
     {
@@ -33,7 +35,9 @@ public class BaseCameraController : MonoBehaviour
         audio = GetComponent<AudioSource>();
         collider = GetComponent<BoxCollider2D>();
         rigidbody = GetComponent<Rigidbody2D>();
-        zoomInterpolator = new Interpolator(zoomDuration, camera.orthographicSize, camera.orthographicSize, minZoom, maxZoom);
+        zoomInterpolator = new Interpolator(1 / zoomSpeed, camera.orthographicSize, camera.orthographicSize, minZoom, maxZoom);
+        moveXInterpolator = new Interpolator(1 / moveSpeed);
+        moveYInterpolator = new Interpolator(1 / moveSpeed);
         UpdateColliderSize();
     }
 
@@ -50,8 +54,8 @@ public class BaseCameraController : MonoBehaviour
             UpdateColliderSize();
         }
 
-        inputVector.x = Input.GetAxis("Horizontal");
-        inputVector.y = Input.GetAxis("Vertical");
+        inputVector.x = Input.GetAxisRaw("Horizontal");
+        inputVector.y = Input.GetAxisRaw("Vertical");
         if (inputVector.magnitude == 0)
         {
             var mouseViewportPos = camera.ScreenToWorldPoint(Input.mousePosition);
@@ -59,6 +63,10 @@ public class BaseCameraController : MonoBehaviour
             mouseEdges.DrawDebug();
             inputVector = mouseEdges.GetOutOfBoundsDirection(mouseViewportPos);
         }
+        moveXInterpolator.targetValue = inputVector.x;
+        moveYInterpolator.targetValue = inputVector.y;
+        inputVector.x = moveXInterpolator.Tick();
+        inputVector.y = moveYInterpolator.Tick();
     }
 
     void FixedUpdate()
diff --git a/Assets/Scripts/Interpolator.cs b/Assets/Scripts/Interpolator.cs
index 17b47f9..7ba9a0f 100644
--- a/Assets/Scripts/Interpolator.cs
+++ b/Assets/Scripts/Interpolator.cs
@@ -10,8 +10,12 @@ public class Interpolator
         get => _targetValue;
         set
         {
-            _targetValue = Mathf.Clamp(value, minValue, maxValue);
-            running = true;
+            var newValue = Mathf.Clamp(value, minValue, maxValue);
+            if (!Mathf.Approximately(newValue, _targetValue))
+            {
+                _targetValue = newValue;
+                running = true;
+            }
         }
     }
     public bool running { get; private set; }
-- 
GitLab