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

Unity开发:如何检测isGrounded布尔值至少持续x秒/帧?

嘿,这个问题我之前做Unity第三人称跳跃的时候也踩过坑!核心就是得给isGrounded的状态加个「延迟确认」,避免那种刚碰一下地面(或者动画还没走完)就误判成稳定着地的情况。下面给你两种实用的实现思路,直接套进你的现有代码就行:

方案1:基于时间的延迟检测(推荐)

这种方式更贴合真实的物理体验,你可以直接设置一个延迟时长(比如0.2秒),只有当isGrounded持续为true超过这个时长,才判定为真正着地。

首先在脚本里添加几个变量:

// 可调整的着地确认延迟,比如0.2秒,对应落地动画的收尾时长
public float groundConfirmDelay = 0.2f;
// 记录着地状态持续的时间
private float groundedTimer;
// 经过延迟后的「确认着地」状态,后续逻辑都用这个
private bool isGroundedConfirmed;

然后在FixedUpdate(物理相关逻辑更推荐用这个)里更新状态:

void FixedUpdate()
{
    // 先获取当前帧的着地检测结果
    bool currentGrounded = groundCheck();

    if (currentGrounded)
    {
        // 着地时累加计时器
        groundedTimer += Time.fixedDeltaTime;
        // 当计时器达到设定延迟,标记为确认着地
        if (groundedTimer >= groundConfirmDelay)
        {
            isGroundedConfirmed = true;
            // 这里可以写确认着地后的逻辑:比如恢复跳跃权限、触发落地动画等
            canJump = true; // 替换你原来的canJump时间戳逻辑,按需调整
        }
    }
    else
    {
        // 离开地面时重置计时器和确认状态
        groundedTimer = 0;
        isGroundedConfirmed = false;
    }

    // 你的跳跃逻辑要改成用「确认着地」的状态
    if (JumpCheck() && isGroundedConfirmed)
    {
        float jumpVelocity = Mathf.Sqrt(-2 * gravity * jumpHeight);
        velocityY = jumpVelocity;
        anim.SetTrigger("JumpRun");
        // 跳跃后立刻重置状态,防止连跳
        isGroundedConfirmed = false;
        groundedTimer = 0;
    }
}
方案2:基于帧数的延迟检测

如果你的游戏对帧数稳定性要求更高(比如2D像素游戏),可以用帧数计数来替代时间,确保不管帧率波动,延迟的帧数是固定的。

先添加变量:

// 需要持续的着地帧数,比如6帧(60帧下约0.1秒)
public int groundConfirmFrames = 6;
// 记录着地状态持续的帧数
private int groundedFrameCount;
private bool isGroundedConfirmed;

然后在Update里更新:

void Update()
{
    bool currentGrounded = groundCheck();

    if (currentGrounded)
    {
        groundedFrameCount++;
        // 达到指定帧数后标记确认着地
        if (groundedFrameCount >= groundConfirmFrames)
        {
            isGroundedConfirmed = true;
            canJump = true;
        }
    }
    else
    {
        groundedFrameCount = 0;
        isGroundedConfirmed = false;
    }

    // 跳跃逻辑同样用确认后的状态
    if (JumpCheck() && isGroundedConfirmed)
    {
        float jumpVelocity = Mathf.Sqrt(-2 * gravity * jumpHeight);
        velocityY = jumpVelocity;
        anim.SetTrigger("JumpRun");
        isGroundedConfirmed = false;
        groundedFrameCount = 0;
    }
}

额外注意点

  • 建议把groundCheck()射线检测的逻辑放在FixedUpdate里,和状态更新同步,避免帧率波动导致的检测误差。
  • 你可以根据落地动画的实际时长调整groundConfirmDelay或者groundConfirmFrames,比如动画时长0.3秒,就设为0.25秒,留一点缓冲时间。
  • 如果原来的canJump是用时间戳控制的(比如canJump = Time.time + 0.1f),直接替换成isGroundedConfirmed的判断逻辑就行,更直观。

内容的提问来源于stack exchange,提问作者Quincy Norbert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:20:13