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

如何解决Unity中X轴正负方向AddForce速度不一致的问题

问题分析与解决

你的代码存在两个核心问题导致左右移动速度不一致:

  1. 按键检测方法不统一:向右移动用的是Input.GetKeyDown(仅在按键按下的第一帧触发一次),而向左移动用的是Input.GetKey(只要按键按住,每帧都会触发)。这就导致左移时每帧都在给刚体加力,右移只有按下瞬间加一次力,自然左移速度更快。

  2. 逻辑运算符优先级错误:&&的优先级高于||,所以你的条件判断实际会被解析为Input.GetKeyDown(KeyCode.D) || (Input.GetKeyDown(KeyCode.RightArrow) && IsOnGround),这不符合你原本的逻辑——你应该是想“(按下D或右键)且在地面/空中”,需要给按键检测的部分加上括号。

修正后的代码

void FixedUpdate()
{
    // 向右移动:统一用GetKey,确保按住时持续加力
    if ((Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) && IsOnGround)
    {
        P_Rigidbody.AddForce(GroundSpeed, 0, 0, ForceMode.Acceleration);
    }
    else if ((Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) && !IsOnGround)
    {
        P_Rigidbody.AddForce(AirSpeed, 0, 0, ForceMode.Acceleration);
    }
    // 向左移动:保持GetKey,和右移逻辑一致
    else if ((Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) && IsOnGround)
    {
        P_Rigidbody.AddForce(-GroundSpeed, 0, 0, ForceMode.Acceleration);
    }
    else if ((Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) && !IsOnGround)
    {
        P_Rigidbody.AddForce(-AirSpeed, 0, 0, ForceMode.Acceleration);
    }
}

额外优化建议

可以把按键检测的逻辑提前提取,减少重复代码,让逻辑更清晰:

void FixedUpdate()
{
    bool isRightPressed = Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow);
    bool isLeftPressed = Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow);

    if (isRightPressed)
    {
        float speed = IsOnGround ? GroundSpeed : AirSpeed;
        P_Rigidbody.AddForce(speed, 0, 0, ForceMode.Acceleration);
    }
    else if (isLeftPressed)
    {
        float speed = IsOnGround ? GroundSpeed : AirSpeed;
        P_Rigidbody.AddForce(-speed, 0, 0, ForceMode.Acceleration);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.07 21:03:10