Last active
November 14, 2024 14:46
-
-
Save ashleydavis/f025c03a9221bc840a2b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using UnityEngine; | |
/// <summary> | |
/// A simple free camera to be added to a Unity game object. | |
/// | |
/// Keys: | |
/// wasd / arrows - movement | |
/// q/e - up/down (local space) | |
/// r/f - up/down (world space) | |
/// pageup/pagedown - up/down (world space) | |
/// hold shift - enable fast movement mode | |
/// right mouse - enable free look | |
/// mouse - free look / rotation | |
/// | |
/// </summary> | |
public class FreeCam : MonoBehaviour | |
{ | |
/// <summary> | |
/// Normal speed of camera movement. | |
/// </summary> | |
public float movementSpeed = 10f; | |
/// <summary> | |
/// Speed of camera movement when shift is held down, | |
/// </summary> | |
public float fastMovementSpeed = 100f; | |
/// <summary> | |
/// Sensitivity for free look. | |
/// </summary> | |
public float freeLookSensitivity = 3f; | |
/// <summary> | |
/// Amount to zoom the camera when using the mouse wheel. | |
/// </summary> | |
public float zoomSensitivity = 10f; | |
/// <summary> | |
/// Amount to zoom the camera when using the mouse wheel (fast mode). | |
/// </summary> | |
public float fastZoomSensitivity = 50f; | |
/// <summary> | |
/// Set to true when free looking (on right mouse button). | |
/// </summary> | |
private bool looking = false; | |
void Update() | |
{ | |
var fastMode = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift); | |
var movementSpeed = fastMode ? this.fastMovementSpeed : this.movementSpeed; | |
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) | |
{ | |
transform.position = transform.position + (-transform.right * movementSpeed * Time.deltaTime); | |
} | |
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) | |
{ | |
transform.position = transform.position + (transform.right * movementSpeed * Time.deltaTime); | |
} | |
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) | |
{ | |
transform.position = transform.position + (transform.forward * movementSpeed * Time.deltaTime); | |
} | |
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) | |
{ | |
transform.position = transform.position + (-transform.forward * movementSpeed * Time.deltaTime); | |
} | |
if (Input.GetKey(KeyCode.Q)) | |
{ | |
transform.position = transform.position + (transform.up * movementSpeed * Time.deltaTime); | |
} | |
if (Input.GetKey(KeyCode.E)) | |
{ | |
transform.position = transform.position + (-transform.up * movementSpeed * Time.deltaTime); | |
} | |
if (Input.GetKey(KeyCode.R) || Input.GetKey(KeyCode.PageUp)) | |
{ | |
transform.position = transform.position + (Vector3.up * movementSpeed * Time.deltaTime); | |
} | |
if (Input.GetKey(KeyCode.F) || Input.GetKey(KeyCode.PageDown)) | |
{ | |
transform.position = transform.position + (-Vector3.up * movementSpeed * Time.deltaTime); | |
} | |
if (looking) | |
{ | |
float newRotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * freeLookSensitivity; | |
float newRotationY = transform.localEulerAngles.x - Input.GetAxis("Mouse Y") * freeLookSensitivity; | |
transform.localEulerAngles = new Vector3(newRotationY, newRotationX, 0f); | |
} | |
float axis = Input.GetAxis("Mouse ScrollWheel"); | |
if (axis != 0) | |
{ | |
var zoomSensitivity = fastMode ? this.fastZoomSensitivity : this.zoomSensitivity; | |
transform.position = transform.position + transform.forward * axis * zoomSensitivity; | |
} | |
if (Input.GetKeyDown(KeyCode.Mouse1)) | |
{ | |
StartLooking(); | |
} | |
else if (Input.GetKeyUp(KeyCode.Mouse1)) | |
{ | |
StopLooking(); | |
} | |
} | |
void OnDisable() | |
{ | |
StopLooking(); | |
} | |
/// <summary> | |
/// Enable free looking. | |
/// </summary> | |
public void StartLooking() | |
{ | |
looking = true; | |
Cursor.visible = false; | |
Cursor.lockState = CursorLockMode.Locked; | |
} | |
/// <summary> | |
/// Disable free looking. | |
/// </summary> | |
public void StopLooking() | |
{ | |
looking = false; | |
Cursor.visible = true; | |
Cursor.lockState = CursorLockMode.None; | |
} | |
} |
Start Unity. Add a Game Object to the scene. Add this component to the Game Object.
Are you able to just add code to Unity games? I don't believe it's possible to do that, unless you already have the code for the game. But feel free to do some research for yourself.
Thanks for this, mostly works, but i noticed in look mode, directly up and down kinda glitches out.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is a Unity component.
Start Unity. Add a Game Object to the scene. Add this component to the Game Object.