Combined Camera Movement and Mouse Look Script

This is a simple combination of two scripts. I was not satisfied with the camera move and mouse look scripts I found. Hopefully, this will help someone else. The movement is really only for looking at a scene in game.

Simply attach the script to the main camera.

Show Code

using UnityEngine;

// Daniel Flanigan, 2014
// This is a combined mouse look and camera move script.
// The cam move script is by: Francis R. Griffiths-Keam

public class CombinedMouseLookAndCameraMove : MonoBehaviour
{
        Vector2 _mouseAbsolute;
        Vector2 _smoothMouse;
        [Space (20)]
        [Header ("Mouse Look Settings :")]
        public Vector2
                clampInDegrees = new Vector2 (360, 180);
        public bool lockCursor;
        public Vector2 sensitivity = new Vector2 (2, 2);
        public Vector2 smoothing = new Vector2 (3, 3);
        public Vector2 targetDirection;
        public Vector2 targetCharacterDirection;
   
        // Assign this if there's a parent object controlling motion, such as a Character Controller.
        // Yaw rotation will affect this object instead of the camera if set.
        public GameObject characterBody;
       
        [Space (20)]
        [Header ("Camera Move Settings :")]

        public float speed = 5.0f;
       
        public KeyCode fwdKey = KeyCode.W;
        public KeyCode leftKey = KeyCode.A;
        public KeyCode backKey = KeyCode.S;
        public KeyCode rightKey = KeyCode.D;
   
        void Start ()
        {
                // Set target direction to the camera's initial orientation.
                targetDirection = transform.localRotation.eulerAngles;
       
                // Set target direction for the character body to its inital state.
                if (characterBody)
                        targetCharacterDirection = characterBody.transform.localRotation.eulerAngles;
        }
   
        void Update ()
        {
                // Ensure the cursor is always locked when set
                Screen.lockCursor = lockCursor;
       
                // Allow the script to clamp based on a desired target value.
                var targetOrientation = Quaternion.Euler (targetDirection);
                var targetCharacterOrientation = Quaternion.Euler (targetCharacterDirection);
       
                // Get raw mouse input for a cleaner reading on more sensitive mice.
                var mouseDelta = new Vector2 (Input.GetAxisRaw ("Mouse X"), Input.GetAxisRaw ("Mouse Y"));
       
                // Scale input against the sensitivity setting and multiply that against the smoothing value.
                mouseDelta = Vector2.Scale (mouseDelta, new Vector2 (sensitivity.x * smoothing.x, sensitivity.y * smoothing.y));
       
                // Interpolate mouse movement over time to apply smoothing delta.
                _smoothMouse.x = Mathf.Lerp (_smoothMouse.x, mouseDelta.x, 1f / smoothing.x);
                _smoothMouse.y = Mathf.Lerp (_smoothMouse.y, mouseDelta.y, 1f / smoothing.y);
       
                // Find the absolute mouse movement value from point zero.
                _mouseAbsolute += _smoothMouse;
       
                // Clamp and apply the local x value first, so as not to be affected by world transforms.
                if (clampInDegrees.x < 360)
                        _mouseAbsolute.x = Mathf.Clamp (_mouseAbsolute.x, -clampInDegrees.x * 0.5f, clampInDegrees.x * 0.5f);
       
                var xRotation = Quaternion.AngleAxis (-_mouseAbsolute.y, targetOrientation * Vector3.right);
                transform.localRotation = xRotation;
       
                // Then clamp and apply the global y value.
                if (clampInDegrees.y < 360)
                        _mouseAbsolute.y = Mathf.Clamp (_mouseAbsolute.y, -clampInDegrees.y * 0.5f, clampInDegrees.y * 0.5f);
       
                transform.localRotation *= targetOrientation;
       
                // If there's a character body that acts as a parent to the camera
                if (characterBody) {
                        var yRotation = Quaternion.AngleAxis (_mouseAbsolute.x, characterBody.transform.up);
                        characterBody.transform.localRotation = yRotation;
                        characterBody.transform.localRotation *= targetCharacterOrientation;
                } else {
                        var yRotation = Quaternion.AngleAxis (_mouseAbsolute.x, transform.InverseTransformDirection (Vector3.up));
                        transform.localRotation *= yRotation;
                }

                if (Input.GetKey (rightKey)) {
                        transform.Translate (new Vector3 (speed * Time.deltaTime, 0, 0));
                }
                if (Input.GetKey (leftKey)) {
                        transform.Translate (new Vector3 (-speed * Time.deltaTime, 0, 0));
                }
                if (Input.GetKey (backKey)) {
                        transform.Translate (new Vector3 (0, 0, -speed * Time.deltaTime));
                }
                if (Input.GetKey (fwdKey)) {
                        transform.Translate (new Vector3 (0, 0, speed * Time.deltaTime));
                }
        }
}

1869423–120080–CombinedMouseLookAndCameraMove.cs (3.9 KB)

4 Likes

Thanks a ton mate! I was going to rewrite the FPS controller script to do exactly this, but you saved me ton of time!

1 Like

Pure piece of code… Thanks for the share and sorry for the bump :slight_smile:

1 Like

Awesome!!!
Thank you so much, man

thanks

Understanding that I’m necroing a very old thread here but, what’s the reason for checking if the clampInDegrees values are less than 360?

As far as I can tell those values are never updated, so considering how they are initialised, the _mouseAbsolute.x value is never clamped?

BRO YOU ARE THE TRUE LEGENED THANKSSSS

Why can’t I find a script that works for walking with gravity? WHY!?

I hear your frustration. But they exist. Here’s one:

https://discussions.unity.com/t/855344

That one has run, walk, jump, slide, crouch… it’s crazy-nutty!!

But please… don’t necro post. If you have an issue, start a fresh thread… it’s FREE!