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
相关产品推荐
相关产品推荐

