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

Unity中玩家身体Y轴旋转超359度时相机旋转出现跳变抖动的问题解决问询

解决相机旋转限制跳变的问题

问题根源

你遇到的跳变问题,核心原因是**Quaternion.eulerAngles.y的取值范围是0°到360°**——当玩家身体旋转超过359°时,这个值会突然回绕到0°左右。而你的相机yRotation是基于鼠标输入累加的连续值(可能从-∞到+∞),两者的坐标系不匹配,导致限制值limitL和limitR从284°/434°直接跳回-75°/75°,触发相机的突然 clamping。

解决方案

我们需要改用连续的角度值来跟踪玩家身体的Y轴旋转,而不是依赖四元数的欧拉角。这样就能彻底避免360°回绕带来的跳变。

修改后的代码

public class MouseLook : MonoBehaviour {
    public Transform CameraBox;
    public Transform lookAtPivot;
    public Transform lookAtObject;
    public Transform playerBody;
    public float sensitivity;
    public float bodyRotSpeed;
    float xRotation = 0f;
    float yRotation = 0f;
    public float limitL;
    public float limitR;
    
    // 添加变量跟踪连续的身体Y轴旋转角度(不会触发360°回绕)
    private float bodyYRotation = 0f;

    void Start() {
        Cursor.lockState = CursorLockMode.Locked;
        // 初始化连续角度为物体初始欧拉角
        bodyYRotation = playerBody.rotation.eulerAngles.y;
    }

    void handleCamRotation() {
        float mouseX = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime;

        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -45, 35);

        yRotation += mouseX;
        // 用连续的bodyYRotation计算限制值,彻底避免回绕跳变
        limitL = bodyYRotation - 75f;
        limitR = bodyYRotation + 75f;
        yRotation = Mathf.Clamp(yRotation, limitL, limitR);

        transform.rotation = Quaternion.Euler(xRotation, yRotation, 0f);
    }

    void handleBodyRotation() {
        // 获取目标Y轴旋转的欧拉角
        float targetY = lookAtObject.rotation.eulerAngles.y;
        // 计算当前连续角度与目标角度的最短差值(自动处理360°回绕)
        float angleDiff = Mathf.DeltaAngle(bodyYRotation, targetY);
        // 平滑更新连续的身体Y轴旋转角度
        bodyYRotation += angleDiff * bodyRotSpeed * Time.deltaTime;

        // 将连续角度应用到玩家身体
        playerBody.rotation = Quaternion.Euler(playerBody.rotation.eulerAngles.x, bodyYRotation, playerBody.rotation.eulerAngles.z);
    }

    void Update() {
        handleCamRotation();

        if (Input.GetKey(KeyCode.W)) {
            handleBodyRotation();
        }
    }
}

关键改动说明

  • 新增bodyYRotation变量:这个变量会连续累加旋转角度,不会像eulerAngles.y那样在360°时强制回绕到0°,完美匹配相机yRotation的连续特性。
  • 用Mathf.DeltaAngle计算旋转差:这个方法会自动处理360°回绕场景,比如目标角度是10°、当前连续角度是350°时,它会计算出差值为20°而非-340°,保证身体旋转始终走最短路径。
  • 基于连续角度计算相机限制:现在limitL和limitR是bodyYRotation ±75°,完全跟随身体的连续旋转,再也不会出现跳变。
  • 直接用连续角度控制身体旋转:不再依赖eulerAngles的回绕值,确保身体旋转状态和角度跟踪完全一致。

这样修改后,无论玩家身体旋转多少圈,相机的限制值都会平滑跟随,跳变现象就能彻底消除。

内容的提问来源于stack exchange,提问作者Mr. Dingleberry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:57:44