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

角色绕Y轴旋转180度后WASD移动反向问题排查

解决方案

问题根源是原代码用了世界空间的方向向量(Vector3.forward/Vector3.right),角色绕Y轴旋转后,WASD对应的世界方向和角色自身前后左右完全相反。而直接替换成transform.forward/transform.right时,只要保证跳跃逻辑只操作世界Y轴,就不会出现跳跃受鼠标控制的问题——你之前的误解可能是混淆了移动方向和跳跃方向的空间。

修改后的代码如下:

public void Update()
{
    isGrounded = controller.isGrounded;

    if (isGrounded)
    {
        x = Input.GetAxis("Horizontal");
        z = Input.GetAxis("Vertical");
        // 落地时重置垂直速度,避免累计重力导致落地卡顿
        velocity.y = 0f;
    }

    // 基于角色自身方向计算移动向量,剔除Y轴分量保证水平移动
    Vector3 moveDir = transform.forward * z + transform.right * x;
    moveDir.y = 0f;
    // 归一化避免斜向移动速度翻倍
    if (moveDir.magnitude > 1f)
    {
        moveDir.Normalize();
    }
    controller.Move(moveDir * speed * Time.deltaTime);

    if (Input.GetButtonDown("Jump") && isGrounded)
    {
        // 跳跃速度仅操作世界Y轴,完全不受角色旋转影响
        velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
    }

    velocity.y += gravity * Time.deltaTime;
    // 垂直方向移动用世界Y轴,和角色旋转无关
    controller.Move(Vector3.up * velocity.y * Time.deltaTime);
}

关键修改点:

  • 移动方向改用transform.forward/transform.right,但强制将Y轴置0,确保移动始终贴合水平地面,且方向随角色自身旋转变化,解决转身反向问题。
  • 单独拆分垂直方向的移动(Vector3.up),完全使用世界空间的Y轴,确保跳跃逻辑和角色旋转、相机视角彻底无关。
  • 落地时重置velocity.y,避免多次累计重力导致落地瞬间的异常速度。
  • 对移动向量归一化,防止斜向移动时(同时按W+A)速度超过设定的speed。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:05:13