Skip to content

Instantly share code, notes, and snippets.

@McFunkypants
Created November 7, 2014 21:59
Show Gist options
  • Star 22 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save McFunkypants/5a9dad582461cb8d9de3 to your computer and use it in GitHub Desktop.
Save McFunkypants/5a9dad582461cb8d9de3 to your computer and use it in GitHub Desktop.
New Script FlyCamera add to any camera obj: instant unity editor style wasd rightclick debug cam
using UnityEngine;
using System.Collections;
public class FlyCamera : MonoBehaviour {
/*
Writen by Windexglow 11-13-10. Use it, edit it, steal it I don't care.
Converted to C# 27-02-13 - no credit wanted.
Simple flycam I made, since I couldn't find any others made public.
Made simple to use (drag and drop, done) for regular keyboard layout
wasd : basic movement
shift : Makes camera accelerate
space : Moves camera on X and Z axis only. So camera doesn't gain any height*/
public float mainSpeed = 100.0f; //regular speed
public float shiftAdd = 250.0f; //multiplied by how long shift is held. Basically running
public float maxShift = 1000.0f; //Maximum speed when holdin gshift
public float camSens = 0.25f; //How sensitive it with mouse
public bool rotateOnlyIfMousedown = true;
public bool movementStaysFlat = true;
private Vector3 lastMouse = new Vector3(255, 255, 255); //kind of in the middle of the screen, rather than at the top (play)
private float totalRun= 1.0f;
void Awake() {
Debug.Log ("FlyCamera Awake() - RESETTING CAMERA POSITION"); // nop?
// nop:
//transform.position.Set(0,8,-32);
//transform.rotation.Set(15,0,0,1);
transform.position = new Vector3(0,8,-32);
transform.rotation = Quaternion.Euler(25,0,0);
}
void Update () {
if (Input.GetMouseButtonDown(1))
{
lastMouse = Input.mousePosition; // $CTK reset when we begin
}
if (!rotateOnlyIfMousedown ||
(rotateOnlyIfMousedown && Input.GetMouseButton(1)))
{
lastMouse = Input.mousePosition - lastMouse ;
lastMouse = new Vector3(-lastMouse.y * camSens, lastMouse.x * camSens, 0 );
lastMouse = new Vector3(transform.eulerAngles.x + lastMouse.x , transform.eulerAngles.y + lastMouse.y, 0);
transform.eulerAngles = lastMouse;
lastMouse = Input.mousePosition;
//Mouse camera angle done.
}
//Keyboard commands
float f = 0.0f;
Vector3 p = GetBaseInput();
if (Input.GetKey (KeyCode.LeftShift)){
totalRun += Time.deltaTime;
p = p * totalRun * shiftAdd;
p.x = Mathf.Clamp(p.x, -maxShift, maxShift);
p.y = Mathf.Clamp(p.y, -maxShift, maxShift);
p.z = Mathf.Clamp(p.z, -maxShift, maxShift);
}
else{
totalRun = Mathf.Clamp(totalRun * 0.5f, 1f, 1000f);
p = p * mainSpeed;
}
p = p * Time.deltaTime;
Vector3 newPosition = transform.position;
if (Input.GetKey(KeyCode.Space)
|| (movementStaysFlat && !(rotateOnlyIfMousedown && Input.GetMouseButton(1)))){ //If player wants to move on X and Z axis only
transform.Translate(p);
newPosition.x = transform.position.x;
newPosition.z = transform.position.z;
transform.position = newPosition;
}
else{
transform.Translate(p);
}
}
private Vector3 GetBaseInput() { //returns the basic values, if it's 0 than it's not active.
Vector3 p_Velocity = new Vector3();
if (Input.GetKey (KeyCode.W)){
p_Velocity += new Vector3(0, 0 , 1);
}
if (Input.GetKey (KeyCode.S)){
p_Velocity += new Vector3(0, 0, -1);
}
if (Input.GetKey (KeyCode.A)){
p_Velocity += new Vector3(-1, 0, 0);
}
if (Input.GetKey (KeyCode.D)){
p_Velocity += new Vector3(1, 0, 0);
}
return p_Velocity;
}
}
@pankuznetsov
Copy link

How to make camera to stop when it collides with an other collider?
(I know that need to attach collider to camera...)

@Mahelita
Copy link

Mahelita commented Aug 1, 2018

Thanks for sharing this!
Works great out of the box.
The X and Z axis constrained motion seems to be buggy, though.
It does not appear to work when using the mouse, while when not using the mouse it is not possible to move along the Y axis anyway.
This makes the feature look kind of useless, or am I missing something?

Edit: does work, sorry.

I added q and e to move down and up in my fork (https://gist.github.com/Mahelita/f82d5b574ab6333f0c834178582280c3), just like in the Unity scene editor.
This incidentally also seems to give a purpose to the X and Z axis constrained motion.

@bison--
Copy link

bison-- commented Jan 2, 2022

Thank you, updated it to the new Unity input system https://gist.github.com/bison--/f97644377bd7f09e43d96547f67fda8a

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