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

Unity3D&C#开发游戏时按空格键偶尔无法正常跳跃问题排查

跳跃功能偶发无响应问题解决方案

核心错误原因

  • Input.GetKeyDown 属于帧输入检测接口,仅在输入事件触发的那一帧Update调用时返回true,而FixedUpdate是固定时间步长调用,运行频率和Update不一致,很容易漏掉按下空格的输入事件,这就是跳跃偶尔无响应的根本原因
  • 直接修改transform.position实现移动的逻辑会和Rigidbody的物理计算冲突,也可能干扰接地状态判断

修复方案

  1. 分离输入检测和物理逻辑:输入检测放到Update里执行,物理相关的力施加、状态判定放到FixedUpdate执行
  2. 用标记位存储跳跃输入状态,避免输入丢失
  3. 移动逻辑改用Rigidbody的速度/力实现,不要直接修改transform.position

修复后的示例代码

private bool jumpPressed;
// Update 每帧调用,用来处理输入
private void Update()
{
    // 检测跳跃输入,按下就标记为true
    if (Input.GetKeyDown(KeyCode.Space))
    {
        jumpPressed = true;
    }
}
// FixedUpdate 固定步长调用,处理物理逻辑
private void FixedUpdate()
{
    Grounded();
    Jump();
    Move();
}
private void Jump()
{
    // 有跳跃输入标记且在地面上才执行跳跃
    if(jumpPressed && this.grounded)
    {
        this.rb.AddForce(Vector3.up * 4, ForceMode.Impulse);
        // 执行完跳跃立刻把标记复位,避免重复触发
        jumpPressed = false;
    }
    // 防止空中按下的输入被保留到落地后误触发,非接地状态清空标记
    else if (!this.grounded)
    {
        jumpPressed = false;
    }
}
// 移动逻辑修改为用Rigidbody实现,避免和物理冲突
private void Move()
{
    float verticalAxis = Input.GetAxis("Vertical");
    float horizontalAxis = Input.GetAxis("Horizontal");
    Vector3 movement = this.transform.forward * verticalAxis + this.transform.right * horizontalAxis;
    movement.Normalize();
    // 保留Y轴速度,只修改水平方向速度
    movement = new Vector3(movement.x * 4f, rb.velocity.y, movement.z * 4f);
    rb.velocity = movement;
    this.anim.SetFloat("vertical", verticalAxis);
    this.anim.SetFloat("horizontal", horizontalAxis);
}

额外校验点

  • 确认layerMask参数仅包含地面层,不要把玩家自身的层包含进去,避免接地状态误判
  • 可以适当调大CheckSphere的检测半径,避免地面碰撞体边缘位置检测不到的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:36:04