第一人称游戏玩家左右视角抖动求助(遵循Brackeys教程开发)
第一人称视角左右转动抖动问题修复
问题描述
第一人称游戏中上下视角转动正常,但左右视角转动时出现抖动,使用的MouseLook脚本与Brackeys教程一致但效果不符,代码如下:
public class MouseLook : MonoBehaviour { public float mouseSentivity = 100f; public Transform playerBody; float xRotation = 0f; void Update() { float mouseX = Input.GetAxis("Mouse X") * mouseSentivity * Time.deltaTime; float mouseY = Input.GetAxis("Mouse Y") * mouseSentivity * Time.deltaTime; xRotation -= mouseY; xRotation = Mathf.Clamp(xRotation, -90f, 90f); transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f); playerBody.Rotate(Vector3.up * mouseX); } }
可能原因与修复方案
1. 旋转累积方式导致的精度抖动
直接使用Rotate()方法叠加旋转,可能因浮点精度误差或帧率波动导致每帧旋转量不稳定,进而产生抖动。
修复代码:
将左右旋转的角度累积到变量中,直接设置物体的旋转值,而非增量叠加:
public class MouseLook : MonoBehaviour { public float mouseSentivity = 100f; public Transform playerBody; float xRotation = 0f; float yRotation = 0f; // 新增左右旋转累积变量 void Update() { float mouseX = Input.GetAxis("Mouse X") * mouseSentivity * Time.deltaTime; float mouseY = Input.GetAxis("Mouse Y") * mouseSentivity * Time.deltaTime; xRotation -= mouseY; xRotation = Mathf.Clamp(xRotation, -90f, 90f); yRotation += mouseX; // 累积左右旋转角度 transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f); playerBody.localRotation = Quaternion.Euler(0f, yRotation, 0f); // 直接设置旋转 } }
2. 鼠标输入平滑与帧率不匹配
Input.GetAxis()自带输入平滑,但结合Time.deltaTime后,若帧率波动较大,可能导致旋转速度不稳定。可改用无平滑的Input.GetAxisRaw(),或添加自定义平滑处理:
自定义平滑版本:
public class MouseLook : MonoBehaviour { public float mouseSentivity = 100f; public Transform playerBody; public float smoothTime = 0.05f; // 平滑系数,值越小越灵敏 float xRotation = 0f; float yRotation = 0f; float currentYRotationVelocity = 0f; // 平滑用的速度变量 void Update() { float mouseX = Input.GetAxisRaw("Mouse X") * mouseSentivity * Time.deltaTime; float mouseY = Input.GetAxisRaw("Mouse Y") * mouseSentivity * Time.deltaTime; xRotation -= mouseY; xRotation = Mathf.Clamp(xRotation, -90f, 90f); // 使用平滑阻尼处理左右旋转 yRotation = Mathf.SmoothDamp(yRotation, yRotation + mouseX, ref currentYRotationVelocity, smoothTime); transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f); playerBody.localRotation = Quaternion.Euler(0f, yRotation, 0f); } }
3. 帧率波动的额外处理
若游戏帧率波动较大,可尝试将鼠标输入的计算移至FixedUpdate()(注意FixedUpdate()的时间步长固定,需调整灵敏度参数),或启用Unity的垂直同步(V-Sync)减少帧率波动。
内容的提问来源于stack exchange,提问作者ryandi fahrizal
相关产品推荐
相关产品推荐

