Unity 2D跳跃逻辑问题:落地未使用跳跃时掉落平台仍可跳跃
问题原因
用户提供的原代码截图:
- 你的代码中
isGrounded状态仅在两个节点修改:主动触发跳跃时赋值为false、与地面碰撞触发OnCollisionEnter2D时赋值为true - 当角色从平台边缘滑落、平台销毁掉落等非主动跳跃的离地场景下,没有逻辑修改
isGrounded的状态,它会一直保持为true,因此空中仍然可以触发跳跃,就出现了你说的跳跃次数堆叠的问题。
修复方案
方案1:补充碰撞退出逻辑(快速修复)
补充OnCollisionExit2D方法,当角色离开地面碰撞体时立刻将isGrounded设为false,修改后完整代码如下:
[...] // jump float verticleMove = joyStick.Vertical; if (verticleMove >= .1f && isGrounded) { body.AddForce(new Vector2(0, 10), ForceMode2D.Impulse); FindObjectOfType<AudioManager>().Play("Jump"); isGrounded = false; } } void OnCollisionEnter2D(Collision2D collision) { if (collision.collider.CompareTag("Enemy")) { TakeDamage(50); } if (collision.collider.CompareTag("Ground")) { isGrounded = true; } } // 新增碰撞退出逻辑 void OnCollisionExit2D(Collision2D collision) { if (collision.collider.CompareTag("Ground")) { isGrounded = false; } }
注意:如果存在角色同时接触多个地面碰撞体的场景,这个方案可能会出现提前把isGrounded设为false的问题,建议用更稳定的方案2
方案2:脚下区域检测(更稳定,推荐)
不用完全依赖碰撞事件,直接在每帧检测角色脚下指定范围内是否存在地面碰撞体,避免碰撞抖动、多地面接触的异常:
// 可以在Inspector面板调整的参数 public float groundCheckRadius = 0.2f; public Transform groundCheckPoint; // 拖入角色脚底的空物体作为检测点 public LayerMask groundLayer; // 选择地面所在的层 [...] // jump // 每帧先检测是否接地 isGrounded = Physics2D.OverlapCircle(groundCheckPoint.position, groundCheckRadius, groundLayer); float verticleMove = joyStick.Vertical; if (verticleMove >= .1f && isGrounded) { body.AddForce(new Vector2(0, 10), ForceMode2D.Impulse); FindObjectOfType<AudioManager>().Play("Jump"); } } void OnCollisionEnter2D(Collision2D collision) { if (collision.collider.CompareTag("Enemy")) { TakeDamage(50); } }
这个方案不用再维护碰撞进入退出的isGrounded赋值,完全由实时检测判断,只要角色离开地面,isGrounded就会立刻变为false,不会出现空中可跳的问题。
内容的提问来源于stack exchange,提问作者Burhan Ahmad
相关产品推荐
相关产品推荐

