Skip to content

Instantly share code, notes, and snippets.

@canxerian
Forked from FreyaHolmer/FlyCamera.cs
Last active January 3, 2023 14:52
Show Gist options
  • Save canxerian/be18cd4040c63839f67fc03e39e12704 to your computer and use it in GitHub Desktop.
Save canxerian/be18cd4040c63839f67fc03e39e12704 to your computer and use it in GitHub Desktop.
A camera controller for easily flying around a scene in Unity smoothly. WASD for lateral movement, Space & Ctrl for vertical movement, Shift to move faster. Add this script to an existing camera, or an empty game object, hit play, and you're ready to go~
// https://gist.github.com/FreyaHolmer/650ecd551562352120445513efa1d952
using UnityEngine;
[RequireComponent(typeof(Camera))]
public class FlyCamera : MonoBehaviour
{
public float acceleration = 50; // how fast you accelerate
public float accSprintMultiplier = 4; // how much faster you go when "sprinting"
public float lookSensitivity = 1; // mouse look sensitivity
public float dampingCoefficient = 5; // how quickly you break to a halt after you stop your input
public bool focusOnEnable = true; // whether or not to focus and lock cursor immediately on enable
Vector3 velocity; // current velocity
static bool Focused
{
get => Cursor.lockState == CursorLockMode.Locked;
set
{
Cursor.lockState = value ? CursorLockMode.Locked : CursorLockMode.None;
Cursor.visible = value == false;
}
}
void OnEnable()
{
if (focusOnEnable) Focused = true;
}
void OnDisable() => Focused = false;
void Update()
{
// Input
if (Focused)
UpdateInput();
else if (Input.GetMouseButtonDown(0))
Focused = true;
// Physics
velocity = Vector3.Lerp(velocity, Vector3.zero, dampingCoefficient * Time.deltaTime);
transform.position += velocity * Time.deltaTime;
}
void UpdateInput()
{
// Position
velocity += GetAccelerationVector() * Time.deltaTime;
// Rotation
Vector2 mouseDelta = lookSensitivity * new Vector2(Input.GetAxis("Mouse X"), -Input.GetAxis("Mouse Y"));
Quaternion rotation = transform.rotation;
Quaternion horiz = Quaternion.AngleAxis(mouseDelta.x, Vector3.up);
Quaternion vert = Quaternion.AngleAxis(mouseDelta.y, Vector3.right);
transform.rotation = horiz * rotation * vert;
// Leave cursor lock
if (Input.GetKeyDown(KeyCode.Escape))
Focused = false;
}
Vector3 GetAccelerationVector()
{
Vector3 moveInput = default;
void AddMovement(KeyCode key, Vector3 dir)
{
if (Input.GetKey(key))
moveInput += dir;
}
AddMovement(KeyCode.W, Vector3.forward);
AddMovement(KeyCode.S, Vector3.back);
AddMovement(KeyCode.D, Vector3.right);
AddMovement(KeyCode.A, Vector3.left);
AddMovement(KeyCode.E, Vector3.up);
AddMovement(KeyCode.Q, Vector3.down);
Vector3 direction = transform.TransformVector(moveInput.normalized);
if (Input.GetKey(KeyCode.LeftShift))
return direction * (acceleration * accSprintMultiplier); // "sprinting"
return direction * acceleration; // "walking"
}
}
@canxerian
Copy link
Author

Tiny change to use E/Q keys to move camera position up/down, to model scene view camera control

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