Unity 2D双跳功能实现遇逻辑错误,求排查解决
双跳功能逻辑问题分析与修复
原代码核心逻辑问题
- 错误用
Input.GetKey(持续按住触发)替代Input.GetKeyDown(单次按下触发)计数,按住W时jumpCount会疯狂累加,完全失控 - 落地时仅重置
grounded但未重置jumpCount,导致落地后可能无法触发第一次跳跃 - 双跳条件拆分零散,分支互相干扰,比如
jumpCount>2时强制重置状态的逻辑会打乱正常跳跃流程 - 第一次跳跃额外限制
jumpCount == 0,落地后若没重置计数,这个条件永远不满足
修复后的代码
using UnityEngine; public class movementscript : MonoBehaviour { public Rigidbody2D mybody; public bool grounded = false; // 最大跳跃次数,双跳设为2 public int maxJumpCount = 2; private int currentJumpCount; void Start() { // 初始化时给满跳跃次数 currentJumpCount = maxJumpCount; } void Update() { // 只在单次按下W时触发跳跃判断 if (Input.GetKeyDown(KeyCode.W)) { // 在地面时,直接跳并重置剩余跳跃次数 if (grounded) { Jump(); currentJumpCount = maxJumpCount - 1; grounded = false; } // 不在地面但还有剩余次数时,触发双跳 else if (currentJumpCount > 0) { Jump(); currentJumpCount--; } } } // 把跳跃逻辑封装成方法,避免重复代码 private void Jump() { // 保留X轴原有速度,只修改Y轴,避免跳跃时横向移动中断 mybody.velocity = new Vector2(mybody.velocity.x, 10f); } private void OnCollisionEnter2D(Collision2D collision) { // 落地同时重置地面状态和跳跃次数 grounded = true; currentJumpCount = maxJumpCount; } private void OnCollisionExit2D(Collision2D collision) { grounded = false; } }
关键逻辑说明
- 用
currentJumpCount记录剩余跳跃次数,maxJumpCount设为2对应双跳需求,初始化时给满次数 - 统一用
Input.GetKeyDown确保每次按下W只触发一次判断,彻底解决计数失控问题 - 落地时同时重置
grounded和currentJumpCount,保证回到地面后可以重新触发两次跳跃 - 封装
Jump()方法减少冗余,同时保留横向移动速度,更符合正常操作逻辑 - 跳跃时单独修改Y轴速度,避免覆盖X轴的移动状态,让跳跃和横向移动可以同时进行
内容的提问来源于stack exchange,提问作者Derprosa
相关产品推荐
相关产品推荐

