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
相关产品推荐
相关产品推荐

