Unity第一人称鼠标控制异常:无法左右旋转且伴随画面抖动
问题原因与修复方案
核心问题说明
- 无法左右旋转:你给相机直接赋值世界空间欧拉角时强制把Y轴设为0,直接抵消了父级胶囊体的Y轴旋转效果;同时胶囊体的旋转逻辑直接使用
Input.GetAxis("Mouse X")瞬时值赋值,没有累计旋转角度,导致胶囊体本身旋转也无法生效。 - 画面抖动:父子物体的旋转逻辑存在冲突,每帧互相覆盖旋转参数,导致视角反复拉扯出现类似撞墙的抖动。
修复后代码
胶囊体挂载脚本
[SerializeField] private int moveSpeed = 10; [SerializeField] private float rotateSensitivity = 2f; private float yRotation; void Update() { // 处理旋转 yRotation += Input.GetAxis("Mouse X") * rotateSensitivity; transform.eulerAngles = new Vector3(0, yRotation, 0); // 处理移动,显式指定自身坐标系,避免旋转后移动方向错位 transform.Translate( Input.GetAxis("Horizontal") * moveSpeed * Time.deltaTime, 0, Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime, Space.Self ); }
相机挂载脚本
[SerializeField] private float rotateSensitivity = 2f; private float xRotation; void Update() { // 累计俯仰角度 xRotation -= Input.GetAxis("Mouse Y") * rotateSensitivity; // 限制俯仰角度在-90到90度之间,避免翻过头 xRotation = Mathf.Clamp(xRotation, -90f, 90f); // 使用本地欧拉角赋值,仅修改自身X轴旋转,不影响父物体的Y轴旋转 transform.localEulerAngles = new Vector3(xRotation, 0f, 0f); }
关键修改说明
- 新增旋转灵敏度参数,可直接在Inspector面板调整操作手感,不需要修改代码
- 旋转逻辑改为累计鼠标输入的总角度,保证旋转可以持续生效
- 相机改用
localEulerAngles进行赋值,仅控制自身本地坐标的X轴俯仰,完全继承父级胶囊体的Y轴旋转,彻底解决旋转冲突导致的无法转向和抖动问题 - 移动逻辑显式指定
Space.Self,保证转向后移动方向和视角方向保持一致
内容的提问来源于stack exchange,提问作者Behnder
相关产品推荐
相关产品推荐

