- Home /
Limit Horizontal Rotation
I have this function, that rotates the object and the camera associated with the object moving the mouse nicely.
My problem is that the clamp isn't working as intended, I have been trying a few things I found searching but none of them seems to work.
I want the rotation to be clamped betweent -40 and 40 (degrees) but the Clamp is clamping it between 0 and 40 because as soon as the object rotates to <0 degrees, it's actually 359º with is bigger than 40º so it moves back to 40 degrees.
    private void Look()
     {
         _mouseX = Input.GetAxis("Mouse X");
         _mouseY = Input.GetAxis("Mouse Y");
         Vector3 newRotation = transform.localEulerAngles;
 
         newRotation.y += _mouseX * _sensibility * Time.deltaTime;
         newRotation.x += -_mouseY * _sensibility * Time.deltaTime;
 
         newRotation.y = Mathf.Clamp(newRotation.y, -40f, 40f);
 
         transform.localEulerAngles = newRotation;
     }
Thank you :)
Answer by WarmedxMints · Feb 28, 2019 at 07:07 PM
I posted this for someone earlier today. It is easier to handle the rotation on two transforms. So make your camera a child of another gameobject and attach the script to the parent.
 using UnityEngine;
 
 public class MouseLook : MonoBehaviour
 {
     public float Sensitivity = 2f;
     public float YAxisAngleLock = 90f;
 
     public Transform CameraTransform;
 
     private Transform _playerTransform;
 
     private Vector2 _rotation;
     private Quaternion _playerTargetRot;
     private Quaternion _cameraTargetRot;
 
     private void Start()
     {
         _playerTransform = transform;
         _playerTargetRot = _playerTransform.rotation;
         _cameraTargetRot = CameraTransform.rotation;
     }
 
     private void LateUpdate()
     {
         _rotation.x = Input.GetAxis("Mouse X") * Sensitivity;
         _rotation.y = Input.GetAxis("Mouse Y") * Sensitivity;
 
         _playerTargetRot *= Quaternion.Euler(0f, _rotation.x, 0f);
 
         _cameraTargetRot *= Quaternion.Euler(-_rotation.y, 0f, 0f);
 
         _cameraTargetRot = LockCameraMovement(_cameraTargetRot);
 
         _playerTransform.localRotation = _playerTargetRot;
         CameraTransform.localRotation = _cameraTargetRot;
     }
 
     private Quaternion LockCameraMovement(Quaternion q)
     {
         q.x /= q.w;
         q.y /= q.w;
         q.z /= q.w;
         q.w = 1.0f;
 
         float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan(q.x);
 
         angleX = Mathf.Clamp(angleX, -YAxisAngleLock, YAxisAngleLock);
 
         q.x = Mathf.Tan(0.5f * Mathf.Deg2Rad * angleX);
 
         return q;
     }
 }
@Warmedx$$anonymous$$ints Thanks for the fast answer!
If it's not a problem, could you explain what LookCamera$$anonymous$$ovement() does? I'm having a hard time understanding quaternions.
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                