Skip to content

Instantly share code, notes, and snippets.

@JISyed
Last active August 26, 2024 05:45
Show Gist options
  • Save JISyed/5017805 to your computer and use it in GitHub Desktop.
Save JISyed/5017805 to your computer and use it in GitHub Desktop.
Camera movement script in Unity3D. Supports rotating, panning, and zooming. Attach to the main camera. Tutorial explaining code: http://jibransyed.wordpress.com/2013/02/22/rotating-panning-and-zooming-a-camera-in-unity/
// Credit to damien_oconnell from http://forum.unity3d.com/threads/39513-Click-drag-camera-movement
// for using the mouse displacement for calculating the amount of camera movement and panning code.
using UnityEngine;
using System.Collections;
public class MoveCamera : MonoBehaviour
{
//
// VARIABLES
//
public float turnSpeed = 4.0f; // Speed of camera turning when mouse moves in along an axis
public float panSpeed = 4.0f; // Speed of the camera when being panned
public float zoomSpeed = 4.0f; // Speed of the camera going back and forth
private Vector3 mouseOrigin; // Position of cursor when mouse dragging starts
private bool isPanning; // Is the camera being panned?
private bool isRotating; // Is the camera being rotated?
private bool isZooming; // Is the camera zooming?
//
// UPDATE
//
void Update ()
{
// Get the left mouse button
if(Input.GetMouseButtonDown(0))
{
// Get mouse origin
mouseOrigin = Input.mousePosition;
isRotating = true;
}
// Get the right mouse button
if(Input.GetMouseButtonDown(1))
{
// Get mouse origin
mouseOrigin = Input.mousePosition;
isPanning = true;
}
// Get the middle mouse button
if(Input.GetMouseButtonDown(2))
{
// Get mouse origin
mouseOrigin = Input.mousePosition;
isZooming = true;
}
// Disable movements on button release
if (!Input.GetMouseButton(0)) isRotating=false;
if (!Input.GetMouseButton(1)) isPanning=false;
if (!Input.GetMouseButton(2)) isZooming=false;
// Rotate camera along X and Y axis
if (isRotating)
{
Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);
transform.RotateAround(transform.position, transform.right, -pos.y * turnSpeed);
transform.RotateAround(transform.position, Vector3.up, pos.x * turnSpeed);
}
// Move the camera on it's XY plane
if (isPanning)
{
Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);
Vector3 move = new Vector3(pos.x * panSpeed, pos.y * panSpeed, 0);
transform.Translate(move, Space.Self);
}
// Move the camera linearly along Z axis
if (isZooming)
{
Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);
Vector3 move = pos.y * zoomSpeed * transform.forward;
transform.Translate(move, Space.World);
}
}
}
@MNwAtThs
Copy link

Hello Guys is there a way to restrict the camera on the z axis if so I need help

@SaadAli2016
Copy link

not working

@eric2296
Copy link

Hi guys, when I launch the script and I try to zoom or rotate or pan the camera;I've the same error:
-System.NullReferenceException: Object reference not set to an instance of an object at MoveCamera.Update () [0x00193]
why?

@grayrhino
Copy link

eric2296, since the script is using Camera.main... you have to change your Main Camera tag to MainCamera on Inspector. That will fix the error

@fkiran
Copy link

fkiran commented May 8, 2019

Can We add a path so camera will move on the path when swipe?

@WindowsTech-git
Copy link

no

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment