首页 > 解决方案 > 夹紧角度时相机开始发疯

问题描述

我统一构建了一个第一人称控制器,我试图让它让相机跟踪鼠标位置,这样玩家就可以环顾四周,但是当我试图阻止玩家让相机倒置时,相机开始摇晃并且它弄乱了旋转相机的

// Get Axis
float mouseY = Input.GetAxis(mouseYInputName) * mouseSensitivity * 
Time.deltaTime;
// Check if past limit
clampX += mouseY;
if (Mathf.Abs(clampX) < 90f) {
    transform.Rotate(Vector3.left * mouseY);
}
else {
    Vector3 eulerRotation = -transform.eulerAngles;
    eulerRotation.x = (clampX > 90f ? 270f : 90f);
    transform.eulerAngles = eulerRotation;
}

标签: c#unity3d

解决方案


你的代码有一些问题。

首先,在将旋转分配给向量 ( -transform.eulerAngles) 时否定旋转,然后将修改后的向量重新分配给变换。这将产生每帧翻转 Y 轴和 Z 轴旋转的效果。

此外,夹紧本身看起来有点不对劲。现在,当旋转超过 90° 时,它会立即捕捉到 270°,当它超过 -90° 时,它会被捕捉到 90°。

另一个问题:使用您当前的代码,如果玩家在夹紧已经开始后继续移动鼠标,则clampX变量仍在增加。因此,当玩家开始向另一个方向移动鼠标时,他们必须clampX在相机开始移动之前再次将值恢复到可接受的值。

这是一种希望没有这些问题的夹紧方法:

clampX += mouseY;
if (Mathf.Abs(clampX) < 90f) {
    transform.Rotate(Vector3.right * mouseY);
}
else {
    if (clampX > 90f) clampX = 90f;
    else if (clampX < -90f) clampX = -90f;

    Vector3 eulerRotation = transform.eulerAngles;
    eulerRotation.x = clampX;
    transform.eulerAngles = eulerRotation;
}

(我也替换Vector3.leftVector3.right,因为这是 Unity 中的正 X。)


推荐阅读