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

Unity自由漫游相机触发鼠标旋转时丢失键盘旋转效果问题求助

问题根源

你的两套旋转逻辑数据没有同步,直接导致键盘修改的旋转被鼠标逻辑覆盖:

  • 键盘逻辑直接调用RotateAround修改transform的旋转,但没有同步更新你自定义存储的pitch、yaw变量
  • 鼠标逻辑第一次触发时,会直接用初始值为0的pitch、yaw覆盖transform.eulerAngles,直接清空了键盘操作的效果
  • 两种操作使用了完全独立的旋转修改路径,没有共用同一套状态存储,自然无法实现累加效果
修复方案

统一所有旋转操作的修改入口,所有旋转都只修改pitch、yaw两个变量,最后统一赋值给相机变换,避免数据不一致。

步骤1:初始化同步变量

在脚本初始化阶段就把当前相机的默认角度同步到pitch、yaw变量:

private float pitch;
private float yaw;

private void Start()
{
    pitch = transform.eulerAngles.x;
    yaw = transform.eulerAngles.y;
}

步骤2:修改键盘旋转逻辑

不要直接修改transform,改为修改yaw变量:

private void RotateCameraKeyboard()
{
    if (Input.GetKey(KeyCode.Q))
    {
        yaw -= rotationSpeed * Time.deltaTime * 30;
    }
    if (Input.GetKey(KeyCode.E))
    {
        yaw += rotationSpeed * Time.deltaTime * 30;
    }
}

步骤3:精简鼠标旋转逻辑

移除鼠标逻辑里的角度限制和赋值操作,只保留变量修改:

private void RotateCameraMouse()
{
    if (Input.GetMouseButton(2))
    {
        pitch -= rotationSpeed * Input.GetAxis("Mouse Y");
        yaw += rotationSpeed * Input.GetAxis("Mouse X");
    }
}

步骤4:统一在LateUpdate处理角度赋值

把角度限制、归一化、赋值操作统一放到LateUpdate执行,保证所有输入处理完成后再更新相机姿态:

private void LateUpdate()
{
    RotateCameraKeyboard();
    RotateCameraMouse();
    
    // 限制俯仰角范围
    pitch = Mathf.Clamp(pitch, -90f, 90f);
    // 统一处理航向角360度循环,代替原有的两个while循环
    yaw = Mathf.Repeat(yaw, 360f);
    
    transform.eulerAngles = new Vector3(pitch, yaw, 0f);
}

修改完成后键盘和鼠标的旋转操作都会累加,不会再出现之前的覆盖问题。

内容的提问来源于stack exchange,提问作者drake10k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:06:05