diff --git a/Assets/Scenes/Forest.unity b/Assets/Scenes/Forest.unity
index 72c2749da99a605181f077b009fccfe16299414e..cf5f6f608d4408d34a455ec594386f92a2feb342 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 6d8ff04659a4261ca3a0340c8b9e29ffa72aa99b..f1f9736b3e87b21c2501ffc205b5467ed95d9db8 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 17b47f90f825e5f36a9599888f5418c1b7cb5025..7ba9a0f911eddac8398f138ef5d5b9baed60b9e5 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; }