Skip to content

Instantly share code, notes, and snippets.

@KarlRamstedt
Created January 8, 2020 10:17
Show Gist options
  • Save KarlRamstedt/407d50725c7b6abeaf43aee802fdd88e to your computer and use it in GitHub Desktop.
Save KarlRamstedt/407d50725c7b6abeaf43aee802fdd88e to your computer and use it in GitHub Desktop.
A simple First Person Camera rotation script for Unity.
using UnityEngine;
/// <summary>
/// A simple FPP (First Person Perspective) camera rotation script.
/// Like those found in most FPS (First Person Shooter) games.
/// </summary>
public class FirstPersonCameraRotation : MonoBehaviour {
public float Sensitivity {
get { return sensitivity; }
set { sensitivity = value; }
}
[Range(0.1f, 9f)][SerializeField] float sensitivity = 2f;
[Tooltip("Limits vertical camera rotation. Prevents the flipping that happens when rotation goes above 90.")]
[Range(0f, 90f)][SerializeField] float yRotationLimit = 88f;
Vector2 rotation = Vector2.zero;
const string xAxis = "Mouse X"; //Strings in direct code generate garbage, storing and re-using them creates no garbage
const string yAxis = "Mouse Y";
void Update(){
rotation.x += Input.GetAxis(xAxis) * sensitivity;
rotation.y += Input.GetAxis(yAxis) * sensitivity;
rotation.y = Mathf.Clamp(rotation.y, -yRotationLimit, yRotationLimit);
var xQuat = Quaternion.AngleAxis(rotation.x, Vector3.up);
var yQuat = Quaternion.AngleAxis(rotation.y, Vector3.left);
transform.localRotation = xQuat * yQuat; //Quaternions seem to rotate more consistently than EulerAngles. Sensitivity seemed to change slightly at certain degrees using Euler. transform.localEulerAngles = new Vector3(-rotation.y, rotation.x, 0);
}
}
@KarlRamstedt
Copy link
Author

@Romaleks360 Loads of people around the web recommend caching strings in Unity optimization efforts. Check around.
Might be something more specific to the Unity Engine rather than C#.

@andewx
Copy link

andewx commented Feb 15, 2024

Thank you so much I was making a flying camera for my game, and I had a problem where the z orientation kept changing. THIS FIXED IT! Again, thank you.

It pains me to say me too, not sure why the Quaternion.Euler() behaves that way.

@andewx
Copy link

andewx commented Feb 15, 2024

Karl can you explain why perhaps the Quaternion.Euler() rotation creates off-axis rolls?

@ItsMabb
Copy link

ItsMabb commented Mar 22, 2024

Thank you so much. Ive been struggling on this

@machine12145
Copy link

Helped so much thank you! How would I hide my cursor?

here {

public float Sensitivity {
	get { return sensitivity; }
	set { sensitivity = value; }
}
[Range(0.1f, 9f)][SerializeField] float sensitivity = 2f;
[Tooltip("Limits vertical camera rotation. Prevents the flipping that happens when rotation goes above 90.")]
[Range(0f, 90f)][SerializeField] float yRotationLimit = 88f;

Vector2 rotation = Vector2.zero;
const string xAxis = "Mouse X"; //Strings in direct code generate garbage, storing and re-using them creates no garbage
const string yAxis = "Mouse Y";

void Update(){
            **//Cursor.visible = false;**
	rotation.x += Input.GetAxis(xAxis) * sensitivity;
	rotation.y += Input.GetAxis(yAxis) * sensitivity;
	rotation.y = Mathf.Clamp(rotation.y, -yRotationLimit, yRotationLimit);
	var xQuat = Quaternion.AngleAxis(rotation.x, Vector3.up);
	var yQuat = Quaternion.AngleAxis(rotation.y, Vector3.left);

	transform.localRotation = xQuat * yQuat; //Quaternions seem to rotate more consistently than EulerAngles. Sensitivity seemed to change slightly at certain degrees using Euler. transform.localEulerAngles = new Vector3(-rotation.y, rotation.x, 0);
}

}

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