Unity 2D平台游戏双跳后跳跃缓冲(Jump Buffer)实现问题
Jump Buffer功能失效核心原因
你的代码里跳跃缓冲相关的逻辑有3处硬伤,直接导致输入无法被正确记录和触发:
- 缓冲计时器启动逻辑完全写反:当前代码仅当
availableJumps == 0(跳跃次数耗尽)时才给缓冲计时器赋值,完全违背了「玩家按下跳跃键瞬间启动计时」的核心逻辑,空中提前按跳的输入根本不会被记录。 - 输入触发逻辑错误:当前代码检测到跳跃键按下就直接调用
Jump(),此时角色处于空中、跳跃次数已耗尽的话,Jump()内所有判定分支都不满足,输入直接丢弃,没有被缓存。 - 落地时没有检测缓冲状态:当前代码仅在玩家主动按跳时走跳跃判定,落地重置跳跃次数的瞬间没有检查是否有未消费的缓冲输入,就算输入被记录也不会触发跳跃。
具体修复方案
1. 重写Update内的缓冲计时与输入逻辑
把Update中原先的缓冲计时、跳跃输入相关代码替换为以下内容,土狼时间、移动、蹲伏输入的代码保持原样即可:
// 土狼时间逻辑保持不变 if(isGrounded) coyoteTimeCounter = coyoteTime; else coyoteTimeCounter -= Time.deltaTime; // 重写跳跃缓冲逻辑:按下跳跃键时启动缓冲计时,否则持续倒计时 if(Input.GetButtonDown("Jump")) { bufferTimeCounter = bufferTime; } else { bufferTimeCounter -= Time.deltaTime; } // 防止计时器变为负数 bufferTimeCounter = Mathf.Max(bufferTimeCounter, 0f); // 移除原来的 Input.GetButtonDown("Jump") 直接调用Jump()的代码 // 低跳(松键削减跳跃高度)逻辑保持不变 if(Input.GetButtonUp("Jump") && rb.velocity.y > 0) lowJump();
2. 给落地逻辑增加缓冲检测
修改GroundCheck()方法中刚落地的分支,重置跳跃次数后立刻检测是否有有效缓冲输入,有则直接触发跳跃:
if(colliders.Length> 0) { isGrounded=true; if(!wasGrounded) { availableJumps = totalJumps; multipleJumps=false; // 新增:落地时检测缓冲输入,有效则直接触发跳跃 if(bufferTimeCounter > 0f && !isCrouching) { Jump(); } } }
3. 修正Jump()方法的判定条件
把Jump()方法中初始跳跃的错误判定条件修改,移除永远成立的bufferTimeCounter >=0f判断,触发跳跃后立刻清空缓冲计数器,避免重复触发:
void Jump() { #region Initial Jumps Mechanics // 修正:仅在落地状态下触发初始跳跃 if(!isCrouching && isGrounded) { rb.velocity = Vector2.up * jumpForce; multipleJumps= true; availableJumps--; bufferTimeCounter = 0f; // 消费缓冲后清空计时器 animator.SetBool("Jumping", true); Debug.Log("Initial Jump"); } #endregion else { #region Coyote Jumps Mechanics // 土狼跳逻辑保持不变,触发后同样清空缓冲 if(!isCrouching && coyoteTimeCounter> 0f) { rb.velocity = Vector2.up * jumpForce; multipleJumps = true; availableJumps--; bufferTimeCounter = 0f; coyoteTimeCounter = 0f; // 触发土狼跳后同时清空土狼时间,避免重复触发 animator.SetBool("Jumping", true); Debug.Log("Coyote Jump"); } #endregion #region Multiple Jump Mechanics // 多段跳(双跳)逻辑保持不变,触发后清空缓冲 else if(!isCrouching && availableJumps> 0 && multipleJumps) { rb.velocity = Vector2.up * jumpForce; availableJumps--; bufferTimeCounter = 0f; animator.SetBool("Jumping", true); Debug.Log("Multiple Jump"); } #endregion } }
额外说明
- 修复后双跳用完、即将落地的0.2秒(你设置的bufferTime值)窗口内按跳跃键,输入会被记录,落地瞬间会自动触发跳跃,不需要玩家卡落地帧按键。
- 原土狼跳逻辑本身没有问题,修复时额外加了触发后清空土狼计时器的逻辑,避免土狼时间和多段跳逻辑冲突。
- 记得把Inspector里的
totalJumps设置为2,对应初始跳+1次双跳的需求。
内容的提问来源于stack exchange,提问作者Tran Trong Tin
相关产品推荐
相关产品推荐

