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

Unity玩家跳跃时速度异常加速(类似连跳BUG)问题求助

问题修复:玩家跳跃时速度异常加速的BUG

玩家跳跃时(无论地面或空中直线移动)会出现类似Bunny Hop的速度加速问题,目标是让玩家保持10的恒定移动速度,尝试过添加空气阻力、修改body.velocity但未解决。

当前代码

private void FixedUpdate()
{
    Body.AddForce(Vector3.right * Walk, ForceMode.Force);
}  
private void Update()
{
    if (TimerLoad > 0)
    {
        TimerLoad -= Time.deltaTime;
        
    }
    else
    {
        if ( IsStoppedByWall == false && lives.live >= 0) // and live > 1 so its not -1 lives
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                if (CanJump == true && JumpCount < 2)
                {
                    JumpCount ++;
                    Body.AddForce(Vector3.up * JumpPower);    
                    Debug.Log(JumpCount);
                }
                else
                {
                    CanJump = false;
                }
            }
            if (Input.GetKey(KeyCode.A))
            {
                Body.AddForce(Vector3.back * Walk, ForceMode.Force);
            }
            else if (Input.GetKey(KeyCode.D))
            {
                Body.AddForce(Vector3.forward * Walk, ForceMode.Force);
            }
        }
        else
        {
            Destroy(Body);
            Debug.Log("Stopped");
        }
    }
}

修复方案

问题根源在于持续使用AddForce施加力,会让玩家的速度不断叠加(包括空中),导致越跳越快。要实现恒定移动速度,推荐直接控制速度的水平分量,而非持续加力:

方法1:直接设置水平速度(推荐)

将移动逻辑从AddForce改为直接设置Rigidbody的水平速度,保留垂直方向速度以不影响跳跃手感:

private void FixedUpdate()
{
    // 基础向右移动的恒定速度(设为10)
    Vector3 targetVelocity = Vector3.right * 10f;

    // 处理A/D键的额外移动,同样保持恒定速度
    if (Input.GetKey(KeyCode.A))
    {
        targetVelocity += Vector3.back * 10f;
    }
    else if (Input.GetKey(KeyCode.D))
    {
        targetVelocity += Vector3.forward * 10f;
    }

    // 保留当前垂直方向的速度,避免干扰跳跃的下落和上升过程
    targetVelocity.y = Body.velocity.y;

    // 应用目标速度
    Body.velocity = targetVelocity;
}

private void Update()
{
    if (TimerLoad > 0)
    {
        TimerLoad -= Time.deltaTime;
    }
    else
    {
        if (!IsStoppedByWall && lives.live >= 0)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                if (CanJump && JumpCount < 2)
                {
                    JumpCount++;
                    // 跳跃用ForceMode.Impulse更合适,瞬时施加冲量符合跳跃手感
                    Body.AddForce(Vector3.up * JumpPower, ForceMode.Impulse);
                    Debug.Log(JumpCount);
                }
                else
                {
                    CanJump = false;
                }
            }
        }
        else
        {
            Destroy(Body);
            Debug.Log("Stopped");
        }
    }
}

方法2:限制最大水平速度(兼容原有加力逻辑)

如果一定要保留AddForce的方式,可以在每次加力后限制水平方向的最大速度:

private void FixedUpdate()
{
    Body.AddForce(Vector3.right * Walk, ForceMode.Force);
    ClampHorizontalSpeed();
}

private void Update()
{
    if (TimerLoad > 0)
    {
        TimerLoad -= Time.deltaTime;
    }
    else
    {
        if (!IsStoppedByWall && lives.live >= 0)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                if (CanJump && JumpCount < 2)
                {
                    JumpCount++;
                    Body.AddForce(Vector3.up * JumpPower);
                    Debug.Log(JumpCount);
                }
                else
                {
                    CanJump = false;
                }
            }
            if (Input.GetKey(KeyCode.A))
            {
                Body.AddForce(Vector3.back * Walk, ForceMode.Force);
                ClampHorizontalSpeed();
            }
            else if (Input.GetKey(KeyCode.D))
            {
                Body.AddForce(Vector3.forward * Walk, ForceMode.Force);
                ClampHorizontalSpeed();
            }
        }
        else
        {
            Destroy(Body);
            Debug.Log("Stopped");
        }
    }
}

// 限制水平方向最大速度为10
private void ClampHorizontalSpeed()
{
    Vector3 currentVelocity = Body.velocity;
    // 提取水平方向速度分量
    Vector3 horizontalVelocity = new Vector3(currentVelocity.x, 0, currentVelocity.z);
    if (horizontalVelocity.magnitude > 10f)
    {
        // 归一化后乘以最大速度,保留方向同时限制速度
        horizontalVelocity = horizontalVelocity.normalized * 10f;
        // 重新赋值,保留垂直方向速度
        Body.velocity = new Vector3(horizontalVelocity.x, currentVelocity.y, horizontalVelocity.z);
    }
}

注意:需确保落地后重置JumpCount为0、CanJump为true,这部分逻辑当前代码未体现,需自行补充,否则会影响多段跳的正常触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:57:38