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

使用Quaternion.Slerp的行星漫游控制器Y轴漂移问题求助

问题诊断与修复方案

你的Y轴旋转漂移问题主要来自以下几个核心问题:

1. 旋转累积误差与低效组件获取

NewRotation方法中每次通过transform.GetComponent<Rigidbody>()重复获取组件,不仅浪费性能,更关键的是用Quaternion.Slerp累积旋转增量的方式会产生持续的插值误差。Slerp是近似插值运算,每次将当前旋转向"当前旋转+增量"做插值,多次累积后必然出现Y轴方向的漂移。

2. 未基于行星表面局部坐标系的旋转逻辑

在行星表面,玩家的"向上"方向始终指向行星外侧(由GravityBody控制),你的旋转计算没有明确约束绕玩家自身局部Y轴旋转,而是直接使用世界坐标系的Y轴增量,当玩家处于行星不同位置时,局部Y轴与世界Y轴的夹角变化会导致旋转逻辑混乱。


修复后的代码修改

步骤1:提前初始化Rigidbody

在Start方法中完成rb的初始化,避免重复获取组件:

void Start()
{
    _gravityBody = transform.GetComponent<GravityBody>();
    rb = GetComponent<Rigidbody>(); // 新增:提前初始化刚体组件
    playerAnimator = GetComponent<Animator>();
    planetRecall = GameObject.FindGameObjectWithTag("Planet Recall");
}

步骤2:重写NewRotation方法,消除旋转漂移

替换原有的旋转逻辑,直接计算绕局部Y轴的精确旋转增量,彻底避免插值误差:

private void NewRotation()
{
    // 获取鼠标X轴输入,计算绕局部Y轴的旋转增量
    float mouseX = Input.GetAxisRaw("Mouse X");
    float rotationAmount = mouseX * turnSpeed * Time.deltaTime;
    // 绕玩家自身局部Y轴旋转,确保不破坏行星表面的向上朝向
    Quaternion turnRotation = Quaternion.Euler(0f, rotationAmount, 0f);
    rb.MoveRotation(rb.rotation * turnRotation);

    // 左右移动逻辑保留,基于玩家局部坐标系
    Vector3 sideToSide = transform.right * Input.GetAxisRaw("Horizontal");
    rb.MovePosition(rb.position + sideToSide * speed * Time.deltaTime);
}

步骤3:优化RunWalkStand的移动方向(可选,避免移动偏差)

在行星表面,transform.forward可能因重力方向改变偏离行星切线,建议基于行星表面切线方向计算前进方向:

private void RunWalkStand()
{
    float verticalInput = Input.GetAxisRaw("Vertical");
    bool isRunning = Mathf.Abs(verticalInput) > 0.1f;

    if (isRunning)
    {
        // 计算行星表面的切线前向(垂直于重力方向)
        Vector3 planetTangentForward = Vector3.Cross(_gravityBody.GravityDirection, transform.right).normalized;
        Vector3 moveDirection = planetTangentForward * verticalInput;

        float currentSpeed = Input.GetKey(KeyCode.LeftShift) ? speed * runSpeed : speed;
        rb.MovePosition(rb.position + moveDirection * currentSpeed * Time.deltaTime);
        playerAnimator.SetFloat("Speed_f", Input.GetKey(KeyCode.LeftShift) ? 1f : 0.5f);
    }
    else
    {
        playerAnimator.SetFloat("Speed_f", 0f);
    }
}

关键修复说明

  • 移除Quaternion.Slerp的旋转方式,改用精确的旋转增量计算,彻底消除插值带来的累积误差。
  • 明确约束绕玩家局部Y轴旋转,确保在行星任何位置,旋转逻辑都基于玩家自身的朝向坐标系,不受世界坐标系干扰。
  • 提前初始化Rigidbody组件,提升性能同时避免潜在的空引用风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:35:29