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

Unity 2D游戏开发按空格键无法触发玩家跳跃问题求助

问题根因

按空格跳不起来的核心问题是**FixedUpdate里每帧强制重写刚体位置,直接覆盖了Jump()施加的向上速度**,另外还有几处逻辑冲突会导致功能异常:

  • 用Input.GetKey(KeyCode.Space)监听跳跃,按住空格会反复触发Jump,出现无限连跳、高度失控
  • 手动给y轴叠加vertical位移的逻辑,和刚体跳跃的物理计算完全冲突,会直接抵消跳跃的作用力
  • Rigidbody2D.MovePosition()会直接接管刚体位置计算,你每帧都调用它重设位置,Jump方法给velocity赋的向上值还没等物理生效就被覆盖了,自然跳不起来
修复代码

直接替换原有逻辑就行,改动点三个:

  • 跳跃监听换成GetKeyDown,只在按下空格的瞬间触发一次跳跃
  • 删掉FixedUpdate里手动改y轴位置的代码,y轴运动完全交给刚体物理(重力、跳跃速度)控制
  • 移动逻辑统一用刚体velocity实现,不要混用直接改位置和改速度两种控制方式
public class FoxyController : MonoBehaviour
{
    Rigidbody2D rigidbody2d; 
    float horizontal;
    public float moveSpeed = 4f;
    public float jumpVelocity = 10f; 

    void Start()
    {
        rigidbody2d = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        horizontal = Input.GetAxis("Horizontal");
        if (Input.GetKeyDown(KeyCode.Space))
        { 
            Jump(); 
        }
    }

    void FixedUpdate()
    {
        // 只赋值水平速度,保留y轴原有速度(跳跃上升/重力下落的速度)
        rigidbody2d.velocity = new Vector2(horizontal * moveSpeed, rigidbody2d.velocity.y);
    }

    void Jump()
    {
        // 只修改y轴速度,保留当前水平移动速度
        rigidbody2d.velocity = new Vector2(rigidbody2d.velocity.x, jumpVelocity); 
    }
}
配置排查(改完代码仍不跳的时候查)
  • 检查挂载脚本对象上的Rigidbody2D组件:Gravity Scale不能为0,Body Type要选Dynamic,不要选Kinematic
  • 确认角色初始位置没有卡在地面碰撞体里,卡碰撞体的时候物理检测会判定持续接触地面,速度会被重置
  • 检查角色的碰撞体大小有没有异常,不要出现碰撞体完全埋进地面的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:15:35