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

Unity第三人称相机绕物体旋转异常问题求助

解决鼠标控制相机围绕目标旋转时X轴旋转异常的问题

问题根源

你代码的核心问题是使用世界空间欧拉角旋转方向向量:Quaternion.Euler(mouseVector.y, mouseVector.x, 0) * direction中的X轴旋转始终基于世界坐标系的X轴,而非相机当前视角下的局部垂直旋转轴。这就导致相机处于目标不同方位时,鼠标垂直操作的方向会出现反转、偏移,完全不符合直觉。

修正方案

改用维护yaw(水平旋转角度)和pitch(垂直旋转角度)变量的方式,分别处理水平/垂直旋转,确保操作逻辑在任何方位都一致:

首先声明所需变量:

public Transform target;
public float sensitivity = 0.1f;
public float distance = 5f;
public Vector3 tOffset;
private float yaw = 0f;
private float pitch = 0f;
private Vector3 mousePosPrev;

替换你的Start和Update方法:

void Start()
{
    // 根据初始方向初始化yaw和pitch
    Vector3 initialDirection = new Vector3(1f, 0f, 0);
    yaw = Mathf.Atan2(initialDirection.x, initialDirection.z) * Mathf.Rad2Deg;
    pitch = Mathf.Asin(initialDirection.y) * Mathf.Rad2Deg;
    mousePosPrev = Input.mousePosition;
}

void Update()
{
    Vector3 mousePosCurr = Input.mousePosition;
    Vector3 mouseDelta = mousePosCurr - mousePosPrev;
    mousePosPrev = mousePosCurr;

    // 更新旋转角度:左右拖曳控制水平旋转,上下拖曳控制垂直旋转
    yaw += mouseDelta.x * sensitivity;
    pitch -= mouseDelta.y * sensitivity;

    // 限制垂直旋转范围,避免相机翻转(可根据需求调整数值)
    pitch = Mathf.Clamp(pitch, -89f, 89f);

    // 根据角度计算相机指向方向
    Quaternion rotation = Quaternion.Euler(pitch, yaw, 0f);
    Vector3 direction = rotation * Vector3.forward;

    // 设置相机位置(基于目标偏移点+反向方向*距离)
    transform.position = target.position + tOffset - direction * distance;

    // 让相机始终看向目标偏移点
    transform.LookAt(target.position + tOffset, Vector3.up);
}

关键改进点

  • 水平旋转(yaw)绕世界Y轴,保证左右操作始终对应相机绕目标的水平转圈
  • 垂直旋转(pitch)基于当前旋转角度计算,本质是绕相机局部X轴旋转,上下操作方向在任何方位都一致
  • 添加pitch范围限制,避免相机翻转到极端角度后出现方向错乱
  • 逻辑更清晰,后续调整旋转速度、限制范围等需求更容易修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:25:15