高灵敏度/大输入值下Mathf.Clamp()无法有效限制第一人称鼠标视角Y轴旋转的解决方案咨询
高灵敏度/大输入值下Mathf.Clamp()无法有效限制第一人称鼠标视角Y轴旋转的解决方案咨询
我正在开发Unity第一人称视角的鼠标控制逻辑,写了一个MouseLookFirstPerson()方法来处理相机朝向。查资料得知,防止相机上下过度旋转导致翻转的常规操作是用Mathf.Clamp()把相机的X轴旋转角度限制在合理区间内。我把这个方法写在了挂载到玩家胶囊的PlayerCamera脚本里(相机是玩家对象的子物体),代码如下:
void MouseLookFirstPerson() { float sensNormalized = sensMouseLook*Time.deltaTime; //缓存灵敏度与上一帧时间的乘积 float deltaY = sensNormalized*Input.GetAxis("Mouse Y"); //缓存相机Y轴的请求旋转量 float deltaX = sensNormalized*Input.GetAxis("Mouse X"); //缓存玩家X轴的请求旋转量 Vector3 deltaCamera = new Vector3(deltaY, 0, 0); //缓存相机朝向的变化量 Vector3 deltaPlayer = new Vector3(0, deltaX, 0); //缓存玩家朝向的变化量 Vector3 newOrientationCamera = Camera.main.transform.localEulerAngles - deltaCamera; //通过减去请求旋转量得到相机新朝向 Vector3 newOrientationPlayer = transform.eulerAngles + deltaPlayer; //通过加上请求旋转量得到玩家新朝向 Mathf.Clamp(newOrientationCamera.x, 89, -89); //将相机新朝向限制在允许范围内 transform.eulerAngles = newOrientationPlayer; //设置玩家朝向 Camera.main.transform.localEulerAngles = newOrientationCamera; //设置相机朝向 }
这个方法在Update()里被调用,代码如下(另外两个模式的方法还在完善中,不在本次问题范围内):
void Update() { ... switch (cameraMode) { case CameraMode.First: MouseLookFirstPerson(); break; case CameraMode.Third: MouseLookThirdPerson(); break; case CameraMode.Angled: MouseLookAngled(); break; } }
我本来预期相机无论如何都不会超出±89°的旋转范围,但实际测试时,只要快速移动鼠标、或者调高鼠标DPI并持续推到上下边界,相机就会出现抖动,偶尔还会直接翻转,这完全没法正常玩游戏。
我试过用三元运算符做判断,只有当相机当前本地朝向在范围内时才应用旋转,代码如下:
Vector3 newOrientationCamera = Camera.main.transform.localEulerAngles - new Vector3(Camera.main.transform.localRotation.y < 89 && Camera.main.transform.localRotation.y > -89? -deltaY : 0, 0, 0);
但这么做完全没改善相机的行为。
想请教各位,有没有更稳健的方法来限制鼠标视角的Y轴旋转?或者是不是必须做一个“兜底机制”,在检测到相机翻转时重置它的位置?另外抖动的问题也希望能一起解决。
备注:内容来源于stack exchange,提问作者Nicole
相关产品推荐
相关产品推荐

