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

Unity 2D中OverlapBox检测异常:箭头频繁穿透地面求助

Unity 2D箭头穿透地面问题排查与解决

首先看代码里最致命的错误:Physics2D.OverlapBox的参数顺序误用。该方法的第三个参数是检测盒的旋转角度,第四个才是LayerMask,你把whatIsEnemy和whatIsGround(LayerMask)直接传到了角度参数的位置,导致地面检测根本没按指定Layer过滤,自然无法正确触发。

修正核心代码

把OverlapBox的调用补上角度参数(一般填0即可,除非你的检测盒需要旋转),将LayerMask放到第四个参数:

private void FixedUpdate()
{
    // 修正参数顺序:第三个是角度(0表示不旋转),第四个是LayerMask
    damageHit = Physics2D.OverlapBox(damagePosition.position, damageSize, 0f, whatIsEnemy);
    groundHit = Physics2D.OverlapBox(damagePosition.position, damageSize, 0f, whatIsGround);

    if (!hasHitGround)
    {
        if (damageHit)
        {
            Collider2D[] detectedObjects = Physics2D.OverlapBoxAll(damagePosition.position, damageSize, 0f, whatIsEnemy);
            foreach (Collider2D collider in detectedObjects)
            {
                IDamageable damageable = collider.GetComponent<IDamageable>();
                if (damageable != null)
                {
                    damageable.Damage(weaponData.attackDamage);
                    Destroy(gameObject);
                }

                IKnockbackable knockbackable = collider.GetComponent<IKnockbackable>();
                if (knockbackable != null)
                {
                    knockbackable.KnockBack(weaponData.knockbackAngle, weaponData.knockbackStrength, (int)Mathf.Sign(transform.rotation.y));
                }
            }
        }

        if (groundHit)
        {
            rb.gravityScale = 0f;
            rb.velocity = Vector2.zero;
            hasHitGround = true;
            Destroy(gameObject, 10f);
        }
        else if (Mathf.Abs(xStartPos - transform.position.x) >= travelDistance && !isGravityOn)
        {
            isGravityOn = true;
            rb.gravityScale = gravity;
        }
    }
}

额外优化建议

  • 确认LayerMask设置正确:检查whatIsGround变量是否只包含地面所在的Layer,没有误选其他Layer。
  • 刚体设置检查:
    • 箭头的Rigidbody2D不要设为Kinematic,否则物理碰撞相关逻辑会失效;
    • 若箭头速度过快,可开启刚体的Collision Detection为Continuous(2D下可选Continuous或Continuous Dynamic),避免高速物体穿透静态碰撞体。
  • 检测逻辑冗余优化:既然已经用OverlapBox检测到damageHit,后续调用OverlapBoxAll可以复用检测条件,减少重复的物理检测开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:35:39