如何通过脚本让独立于玩家对象的相机随鼠标水平旋转?
相机跟随玩家(分离式)的水平旋转修复方案
问题根源
- 位置计算逻辑错误:原代码直接使用
player.position + offset,这里的offset是世界空间下的固定向量,玩家旋转后,相机不会跟随玩家做水平环绕移动。 - 旋转未同步玩家水平角度:相机仅处理了自身垂直方向(X轴)的旋转,没有同步玩家的水平旋转(Y轴),导致玩家转向时相机视角无法跟上。
- 时间步长误用:
Update方法中应使用Time.deltaTime而非Time.fixedDeltaTime,后者是为固定帧率的FixedUpdate设计的。
修复方案
- 用
Transform.TransformPoint()将局部空间的偏移量转换为世界空间位置,确保相机始终保持相对于玩家的局部偏移关系 - 相机旋转结合玩家的Y轴水平角度与自身的X轴垂直角度
- 修正时间步长的使用方式
修改后的完整代码
public class FollowPlayer : MonoBehaviour { public Transform player; // 此处offset为玩家局部空间下的偏移,例如(0, 2, -5)代表在玩家头顶2单位、身后5单位的位置 public Vector3 offset; public float mouseSensitivity = 100f; float xRotation = 0f; void Start() { Cursor.lockState = CursorLockMode.Locked; } void Update() { // 计算相机位置:将局部偏移转换为世界空间位置 transform.position = player.TransformPoint(offset); float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime; float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime; // 处理相机垂直方向旋转(X轴) xRotation -= mouseY; xRotation = Mathf.Clamp(xRotation, -90f, 90f); // 处理相机水平方向旋转:同步玩家的Y轴角度,叠加自身垂直旋转 transform.rotation = Quaternion.Euler(xRotation, player.eulerAngles.y, 0f); // 控制玩家绕Y轴做水平转向 player.Rotate(Vector3.up * mouseX); } }
额外说明
- 若需要相机水平旋转与玩家旋转独立(比如玩家不转向,相机自主水平环视),可单独维护一个Y轴旋转变量替代同步玩家Y轴角度,但根据你的需求,同步玩家Y轴角度是实现跟随旋转的正确方式。
- 调整
offset参数时,需注意是基于玩家局部坐标系:Z轴负方向对应玩家前方,若想让相机处于玩家身后,将offset的Z值设为负数即可。
内容的提问来源于stack exchange,提问作者dangoqut132
相关产品推荐
相关产品推荐

