Hey there, so i am working on a RTS game and ran in to the problem that when i move my camera and want to stop the camera dosent stops instantly it rather slides a while till it stops
heres my code:
using UnityEngine;
using UnityEngine.EventSystems;
public class CameraController : MonoBehaviour
{
public static CameraController instance;
[Header("General")]
[SerializeField] Transform cameraTransform;
public Transform followTransform;
Vector3 newPosition;
Vector3 dragStartPosition;
Vector3 dragCurrentPosition;
[Header("Optional Functionality")]
[SerializeField] bool moveWithKeyboad;
[SerializeField] bool moveWithEdgeScrolling;
[SerializeField] bool moveWithMouseDrag;
[Header("Keyboard Movement")]
[SerializeField] float fastSpeed = 0.3f;
[SerializeField] float normalSpeed = 0.1f;
[SerializeField] float movementSensitivity = 1f; // Hardcoded Sensitivity
float movementSpeed;
{
UP,
DOWN,
LEFT,
RIGHT,
DEFAULT
}
private void Start()
{
instance = this;
newPosition = transform.position;
movementSpeed = normalSpeed;
}
private void Update()
{
// Allow Camera to follow Target
if (followTransform != null)
{
transform.position = followTransform.position;
}
// Let us control Camera
else
{
HandleCameraMovement();
}
if (Input.GetKeyDown(KeyCode.Escape))
{
followTransform = null;
}
}
void HandleCameraMovement()
{
// Mouse Drag
if (moveWithMouseDrag)
{
HandleMouseDragInput();
}
// Keyboard Control
if (moveWithKeyboad)
{
if (Input.GetKey(KeyCode.LeftShift))
{
movementSpeed = fastSpeed;
}
else
{
movementSpeed = normalSpeed;
}
if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow))
{
newPosition += (transform.forward * movementSpeed);
}
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{
newPosition += (transform.forward * -movementSpeed);
}
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
{
newPosition += (transform.right * movementSpeed);
}
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
{
newPosition += (transform.right * -movementSpeed);
}
}
transform.position = Vector3.Lerp(transform.position, newPosition, Time.deltaTime * movementSensitivity);
}
private void HandleMouseDragInput()
{
if (Input.GetMouseButtonDown(2) && EventSystem.current.IsPointerOverGameObject() == false)
{
Plane plane = new Plane(Vector3.up, Vector3.zero);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float entry;
if (plane.Raycast(ray, out entry))
{
dragStartPosition = ray.GetPoint(entry);
}
}
if (Input.GetMouseButton(2) && EventSystem.current.IsPointerOverGameObject() == false)
{
Plane plane = new Plane(Vector3.up, Vector3.zero);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float entry;
if (plane.Raycast(ray, out entry))
{
dragCurrentPosition = ray.GetPoint(entry);
newPosition = transform.position + dragStartPosition - dragCurrentPosition;
}
}
}
}