【Unity相关】相机视角不能正确地被限制在正负90度之间

代码与预期表现不符:请问一下在代码中使用了Mathf.Clamp()把旋转角限制在-90度到90度之间,但是游戏中旋转的X值只能降到0,一旦小于0就被重置回90,这个问题应该怎么解决啊?
以下是我的代码:

public class 移动 : MonoBehaviour
{
    public GameObject playerCamera = GameObject.Find("Camera");
    public float mouseSpeed = 100f;

    float mouseMoveX;
    float mouseMoveY;
    
    // Start is called before the first frame update
    void Start()
    {
      
        Cursor.lockState = CursorLockMode.None;
    }

    // Update is called once per frame
    void Update()
    {
        
        //实时获取Transform的数据
        
        mouseMoveX = Input.GetAxis("Mouse X");//垂直
        mouseMoveY = Input.GetAxis("Mouse Y");//水平

        Look();
       
        
    }
    public void Look()//鼠标控制视角转动的函数
    {
        Vector3 angles = playerCamera.transform.eulerAngles;
        angles.x -= mouseMoveY * mouseSpeed * Time.deltaTime;
        angles.y += mouseMoveX * mouseSpeed * Time.deltaTime;
        angle.x = Mathf.Clamp(angle.x, -90f, 90f);
        playerCamera.transform.eulerAngles = angles;

    }

}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    可以在相机旋转的代码中先将旋转角度限制在正负90度之间,然后再使用Mathf.Clamp01()函数限制在0~1之间。具体代码如下:

    public float sensitivity = 3.0f;
    public float maxYAngle = 90f;
    public float minYAngle = -90f;
    private float rotationY = 0.0f;
    // 处理相机旋转
    void LookRotation()
    {
      float yRot = Input.GetAxis("Mouse X") * sensitivity;
      float xRot = Input.GetAxis("Mouse Y") * sensitivity;
    
      rotationY += xRot;
      rotationY = Mathf.Clamp(rotationY, minYAngle, maxYAngle); // 限制旋转角度在正负90度之间
    
      transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y + yRot, 0);
      transform.localRotation *= Quaternion.Euler(-rotationY, 0, 0);
      transform.localRotation *= Quaternion.Euler(0, transform.localEulerAngles.y + yRot, 0);
      transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, 0);
      transform.localPosition *= Quaternion.Euler(-rotationY, 0, 0);
      transform.localPosition *= Quaternion.Euler(0, yRot, 0);
    
      transform.localPosition = new Vector3(transform.localPosition.x, Mathf.Clamp01(transform.localPosition.y), transform.localPosition.z); // 限制Y轴移动范围在0~1之间
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
public float sensitivity = 3.0f;
public float maxYAngle = 90f;
public float minYAngle = -90f;
private float rotationY = 0.0f;
// 处理相机旋转
void LookRotation()
{
  float yRot = Input.GetAxis("Mouse X") * sensitivity;
  float xRot = Input.GetAxis("Mouse Y") * sensitivity;
 
  rotationY += xRot;
  rotationY = Mathf.Clamp(rotationY, minYAngle, maxYAngle); // 限制旋转角度在正负90度之间
 
  transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y + yRot, 0);
  transform.localRotation *= Quaternion.Euler(-rotationY, 0, 0);
  transform.localRotation *= Quaternion.Euler(0, transform.localEulerAngles.y + yRot, 0);
  transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, 0);
  transform.localPosition *= Quaternion.Euler(-rotationY, 0, 0);
  transform.localPosition *= Quaternion.Euler(0, yRot, 0);
 
  transform.localPosition = new Vector3(transform.localPosition.x, Mathf.Clamp01(transform.localPosition.y), transform.localPosition.z); // 限制Y轴移动范围在0~1之间
}