How to make my camera only rotate on middle mouse click?

Hello, currently my mouse rotates no matter where my mouse goes automatically. I would like it to only rotate when i hold press the middle mouse button, here is my current camera code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ThirdPersonCamera : MonoBehaviour

//All the variables used in this class(Look below to see what they do.
private const float Y_ANGLE_MIN = 10.0f;
private const float Y_ANGLE_MAX = 35.0f;
private const float DISTANCE_MAX = 50.0f;
private const float DISTANCE_MIN = 25.0f;
private const float TRANS_MIN = 1.0f;
private const float TRANS_MAX = 2.0f;

public float dragSpeed = 2;
private Vector3 dragOrigin;

public Transform lookAt;
public Transform camTransform;
public GameObject player;

private Camera cam;

public float distance = 5.0f;
private float currentX = 0.0f;
private float currentY = 0.0f;
private float sensitivityX = 4.0f;
private float sensitivityY = 1.0f;
private float trandis;

public Vector3 height = new Vector3(0, 0, 0);

private bool below = false;

private void Start()

    //Makes camTransform a transform.
    camTransform = transform;
    //Sets variable cam value to the main camera
    cam = Camera.main;

private void Update()

    //Makes the camera move by looking at the axis of the mouse(Also multiplied by the seisitivity.)
    currentX += Input.GetAxis("Mouse X") * sensitivityX;
    currentY += Input.GetAxis("Mouse Y") * sensitivityY;

    //Limits the Y variable
    currentY = Mathf.Clamp(currentY, Y_ANGLE_MIN, Y_ANGLE_MAX);

    //Thiago Laranja's scrollwheel implemetation.
    if (Input.GetAxis("Mouse ScrollWheel") > 0) { distance -= 1.0f; }
    if (Input.GetAxis("Mouse ScrollWheel") < 0) { distance += 1.0f; }

    //Makes sure that these variables never go over the max and be les than the min.
    distance = Mathf.Clamp(distance, DISTANCE_MIN, DISTANCE_MAX);
    trandis = Mathf.Clamp(distance, TRANS_MIN, TRANS_MAX) - 1;

    //Sets players transparency(Make sure that player materials rendering mode has set to transparent or other mode that supports transparency).
    player.GetComponent<Renderer>().material.color = new Color(player.GetComponent<Renderer>().material.color.r, player.GetComponent<Renderer>().material.color.g, player.GetComponent<Renderer>().material.color.b, trandis);

    //Disables the object from rendering if your're at distance 0.8.
    if (distance <= 0.8f) { player.GetComponent<Renderer>().enabled = false; }
    if (distance > 0.8f) { player.GetComponent<Renderer>().enabled = true; }

    //If close enough to the character sinp into distance of 0.1(If distance is 0 the camera cant be rotated.)
    if (distance <= 0.8f && below == false) { distance = 0.1f; below = true; }
    if (distance >= 0.8f && below == true) { below = false; }

private void LateUpdate()

    //Subtracts hte distance from Z coordinate
    Vector3 dir = new Vector3(0, 0, -distance);

    //Creates an quaternion for rotation(too bad that we cannot use Vector3.
    Quaternion rotation = Quaternion.Euler(currentY, currentX, 0);

    //Sets the cameras position and makes it look at player.
    camTransform.position = lookAt.position + height + rotation * dir;
    camTransform.LookAt(lookAt.position + height);



Also to make the camera lock at every 90 degrees, so when i click and drag, it would go, 90, 180, 270, 360, then back to 90.

Thanks in advance for any help :slight_smile:

It’s really easy to make anything require input. You just need to check for the condition with Unity’s Input system and pole for mouse buttons. 2 is the middle click button, what you’re looking for.


In your case I would encapsulate this part:

    currentX += Input.GetAxis("Mouse X") * sensitivityX;
    currentY += Input.GetAxis("Mouse Y") * sensitivityY;

And for rounding the camera angle to 90 degree increments I would add this to the end of the LateUpdate method:

Vector3 angles = camTransform.eulerAngles; //stores rotation in a temporary variable
angles.y = (angles.y/90) * 90; // rounds rotation in 90's
camTransform.eulerAngles = angles; // sets rotation to camera

this works because division by an integer (90) will return an integer. So this should snap your camera every 90 degrees.