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

Unity中按下空格IsGrounded为true,落地时却不为true的问题求助

Unity地面检测反转问题修复

核心错误:BoxCast参数顺序搞反了

你的IsGrounded方法里,Physics2D.BoxCast的参数完全传错了。这个API的正确参数顺序是:中心坐标、盒子大小、旋转角度、检测方向、检测距离、图层掩码。你把检测距离和图层掩码的位置弄混了,还把方向向量和距离合并在一起,直接导致检测逻辑完全颠倒。

修复后的地面检测方法

private bool IsGrounded()
{
    // 正确传参:向下检测,距离0.1f,只检测指定图层
    RaycastHit2D rc = Physics2D.BoxCast(bc.bounds.center, bc.bounds.size, 0f, Vector2.down, 0.1f, lm);
    return rc.collider != null;
}

额外问题:移动逻辑冲突

你在Update里同时用transform.Translate和修改刚体速度来处理移动,这会让物理引擎和直接位置修改打架,可能导致角色位移异常,进一步干扰地面检测。删掉transform.Translate(xInput * moveSpeed, 0, 0)这行,只保留PlatformerMove的逻辑就行。另外跳跃时别直接覆盖x方向速度,不然跳的时候会丢移动惯性:

void Update()
{
    if (IsGrounded() && Input.GetKeyDown(KeyCode.Space))
    {
        float jumpVelocity = 25f;
        // 保留x方向的速度,只修改y方向
        rb.velocity = new Vector2(rb.velocity.x, jumpVelocity);
        Debug.Log("跳跃触发");
    } 
    xInput = Input.GetAxis("Horizontal");
    PlatformerMove();
}

调试小技巧:可视化检测范围

加个Gizmos代码,在编辑器里能看到地面检测的盒子范围,方便你调整参数:

private void OnDrawGizmos()
{
    if (bc == null) return;
    Gizmos.color = Color.red;
    // 画出检测盒子的位置和大小
    Gizmos.DrawWireCube(bc.bounds.center + Vector3.down * 0.1f, bc.bounds.size);
}

最后检查点

  • 确认lm图层掩码只勾选了地面所在的图层,别把玩家自己的图层勾上,不然会检测到自身碰撞器。
  • 如果跳跃后还是有问题,可以微调检测距离(比如改成0.05f或0.15f),或者调整跳跃速度,避免角色跳得过高穿模。

内容的提问来源于stack exchange,提问作者humor 0150

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:35:30