You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:24:03