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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:57:20