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

如何通过脚本让独立于玩家对象的相机随鼠标水平旋转?

相机跟随玩家(分离式)的水平旋转修复方案

问题根源

  1. 位置计算逻辑错误:原代码直接使用player.position + offset,这里的offset是世界空间下的固定向量,玩家旋转后,相机不会跟随玩家做水平环绕移动。
  2. 旋转未同步玩家水平角度:相机仅处理了自身垂直方向(X轴)的旋转,没有同步玩家的水平旋转(Y轴),导致玩家转向时相机视角无法跟上。
  3. 时间步长误用: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:51:36