Area2D with same collision shape as its parent StaticBody2D - detect collision and body_entered (Breakout)

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By lotsofsnow

I have 2 scenes:
Ball:

  • Is a KinematicBody2D with layer “BALL” and mask “WALL”
  • Has CollisionShape2D.
    Brick:
  • Is a StaticBody2D with layer “WALL” and no masks.
  • Has a CollisionShape2D.
  • Has an Area2D with no layers and mask “BALL” and same CollisionShape2D extents as the parent StaticBody2D (also they have the same transforms).

What I would like to achieve is that on contact with Ball, the Brick’s StaticBody2D will collide, and the Brick’s Area2D will emit “body_entered”.

But with this setup, the signal doesn’t get emitted - the ball just gets bounced back after the collision with StaticBody2D - Area2D gets ignored.

If I make the CollisionShape2D of Brick’s StaticBody2D tiny bit smaller than that of Area2D, it works fine - ball collides and bounces back, and the signal from Brick’s Area2D is handled.

Also if I manually trigger the Brick’s OnHit() method from the Ball script side after the collision detection, it works.

But I would like to do it without extra code or changing the extents of the collision shape and am curious why it doesn’t work - is it because the two collision shapes are identical and the StaticBody2D’s has priority over the Area2D’s?

This is the code for the brick:

public class Brick : StaticBody2D
{
    public override void _Ready()
    {
        var area = GetNode<Area2D>("CollisionArea");
        area.Connect("body_entered", this, nameof(OnHit));
    }

    public void OnHit(Node node)
    {
        QueueFree();
    }
}

And the Brick scene hierarchy:
enter image description here

enter image description here