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

Unity 2D游戏角色输入检测正常但无法跳跃问题排查

问题根因

核心代码错误出在PlayerMovement.cs的FixedUpdate方法中,你在调用完角色移动逻辑后,错误地将跳跃标记jump设置为了true,原教程此处逻辑是将jump重置为false,这行笔误直接打乱了跳跃触发的时序。

结合你描述的现象可以直接排除输入映射问题:按键Q的日志能正常打印说明输入捕获完全正常,同一份代码在官方示例可运行说明CharacterController2D的核心逻辑没有问题,除了上述代码错误外,你自己项目中的组件序列化配置错配也可能导致跳跃失效。

逻辑错误说明

跳跃逻辑的正常时序应该是:

  1. Update循环检测到跳跃按键按下,将jump标记设为true
  2. 下一次物理帧FixedUpdate执行时,将jump=true传入Move方法,若此时角色判定为在地面,则施加跳跃力
  3. 跳跃触发完成后立刻将jump重置为false,等待下一次按键输入

你写的jump = true会导致跳跃标记永远不会被清零,每一帧物理更新都在传入jump=true:第一次落地时触发跳跃将角色设为非地面状态后,后续帧虽然jump还是true,但不满足「在地面」的跳跃前置条件,永远无法再次触发跳跃。


修复方案

1. 修正代码笔误

打开PlayerMovement.cs,修改FixedUpdate方法内的重置逻辑:

void FixedUpdate()
{
    controller.Move(horizontalMove * Time.fixedDeltaTime, crouch, jump);
    // 修正:跳跃输入消费完成后必须重置为false
    jump = false;
}

2. 检查项目内组件配置

如果改完代码仍无法跳跃,逐项核对CharacterController2D组件的Inspector配置:

  • 确认场景中的地面对象已分配到独立的Ground层级
  • 确认m_WhatIsGround层掩码仅勾选了Ground层级,未选中其他无关层、也未漏选Ground层
  • 确认m_GroundCheck坐标位于角色碰撞体最底端,略微超出碰撞体边缘,保证站在地面时检测范围能与地面碰撞体重叠
  • 确认m_CeilingCheck坐标位于角色碰撞体最顶端,没有错误放到地面检测位置
  • 确认角色对象上的Rigidbody2D组件重力缩放没有设为0、刚体类型没有设为Kinematic

验证

修改完成后运行项目,角色站在地面时按Q即可正常触发跳跃,下蹲、移动逻辑也不会受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:27:18