Home > Mobile >  How do I fix my camera's xRotation's Clamping?
How do I fix my camera's xRotation's Clamping?

Time:03-30

I made a first person camera using parts of Brackeys Guide, I have camera moving on both the axis but the line for the xRotation clamp doesn't work when I run the game. How can I fix this?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseLook : MonoBehaviour
{   
    
        public float mouseSensitivity = 200f;

        public Transform playerBody;
        public Transform cam;
        private float xRotation = 0f;
        
    // Start is called before the first frame update
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;     // stops you from click out off the sceen
    }
    // Update is called once per frame
    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;    // mouse imput
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;    // mouse imput
    

        xRotation = mouseY;
        xRotation = Mathf.Clamp(xRotation, -80f, 73f);  // stops you from breaking your neck
        

        Quaternion localRotation = Quaternion.Euler(xRotation, 0f, 0f);  // left and right movement
        playerBody.Rotate(Vector3.up * mouseX);  // left and right movement 
        cam.Rotate(Vector3.left * mouseY);  // up and down movement
       
        
    }

Setting new specific variables like roty and rotx, and clamping them individually.

CodePudding user response:

It may be that the Vector3 vector has no value, if a value is generated, it can be

    private  Vector3 m_Dir
    void  Update () {
    this.m_Dir =  new  Vector3 (localRotation, Vector3.up * mouseX,  
    tVector3.left * mouseY); 
    playerBody.Rotate(m_Dir);
    cam.Rotate(m_Dir);
}

CodePudding user response:

There are two main problems in the Update method:

  1. xRotation = mouseY is not correct, since mouseY represents the delta angle you want to rotate in this frame, while xRotation represents the current angle at which the camera is rotated. You have to do a sum to get the next pitch of the camera, so xRotation = mouseY.

  2. The quaternion localRotation is created but not actually used in the rotating logic, you still rotate the camera with cam.Rotate(Vector3.left * mouseY). Replace it with cam.localRotation = localRotation.

The final code should look like this:

float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

// note: you shouldn't hardcode the min and max values,
//       use some values that you can change in the inspector
xRotation = Mathf.Clamp(xRotation   mouseY, -80f, 73f);

cam.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
playerBody.Rotate(Vector3.up * mouseX);
  • Related