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

Unity游戏中如何实时更新玩家移动的轴与方向逻辑?

解决Unity玩家转向后移动方向不同步的问题

你的核心问题是移动向量直接采用了世界空间的坐标轴,未关联玩家当前朝向,导致玩家转向后,按键对应的移动方向仍以世界x/z轴为基准,和预期的“按键对应玩家自身方向”脱节。

修改方案

调整移动向量的计算逻辑,将输入的Horizontal/Vertical轴转换为玩家本地空间的方向,让移动方向实时跟随玩家朝向:

  1. 替换FixedUpdate中移动向量的构建代码
  2. 优化转向逻辑,仅在有输入时更新朝向

修改后的完整代码如下:

public float turnSpeed = 20f;

Animator m_Animator;
Rigidbody m_Rigidbody;

Vector3 m_Movement;
Quaternion m_Rotation = Quaternion.identity;

void Start()
{
    m_Animator = GetComponent<Animator>();
    m_Rigidbody = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");

    // 核心修改:基于玩家自身朝向构建移动向量
    Vector3 localForward = transform.forward;
    Vector3 localRight = transform.right;
    // 忽略Y轴,确保移动始终在水平面上
    localForward.y = 0;
    localRight.y = 0;
    localForward.Normalize();
    localRight.Normalize();

    // 用输入值组合出玩家本地空间的移动方向
    m_Movement = localForward * vertical + localRight * horizontal;
    m_Movement.Normalize();

    bool hasHorizontalInput = !Mathf.Approximately(horizontal, 0f);
    bool hasVerticalInput = !Mathf.Approximately(vertical, 0f);
    bool isWalking = hasHorizontalInput || hasVerticalInput;
    
    m_Animator.SetBool("IsWalking", isWalking);

    // 仅在有移动输入时更新转向
    if (isWalking)
    {
        Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
        m_Rotation = Quaternion.LookRotation(desiredForward);
    }
    else
    {
        // 无输入时保持当前朝向
        m_Rotation = transform.rotation;
    }
}

private void OnAnimatorMove()
{
    m_Rigidbody.MovePosition(m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude);
    m_Rigidbody.MoveRotation(m_Rotation);
}

关键说明

  • 原来的m_Movement.Set(horizontal, 0f, vertical)直接使用世界空间的x/z轴,现在改为用玩家自身的forward(前后)和right(左右)轴组合移动方向,确保按键输入始终对应玩家当前的朝向。
  • 你之前旋转虚拟相机无效,是因为问题根源在玩家移动向量的空间转换,和相机视角无关——如果后续需要移动方向跟随相机视角,只需将transform.forward替换为Camera.main.transform.forward即可(记得处理相机的Y轴旋转)。

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

相关产品推荐
方舟 Agent Plan

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

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