I have the following. Level and player are dynamically loaded.

CharacterBody2D
This is the player. It has collision shapes and the player can walk and physics work. The player also gets BodyEntered events from the floor.

Area2D
The coin. Including a CollisionShape. The shape is visible in Debug mode. All seems to work. Monitoring and Monitorable are enabled. I selected all collision layers and all masks.

I register for the AreEntered event in the Scene Node:

public override void _Ready()
{
  area = GetNode<Area2D>("Area2D");
  area.AreaEntered += (node) => OnCoinBodyEntered(node);
}
...
public void OnCoinBodyEntered(Node2D body)
{
  GD.Print($"OnCoinBodyEntered {body.Name}");
  QueueFree();
}

OnCoinBodyEntered is never called. When I replace the Area2D with a StaticBody2D, then the Player can walk on this as expected.

Any Idea what the problem could be? Any info is welcome.

    SnapCracklins Thanks for the reply. I connected the signal in the code with:

    area.AreaEntered += (node) => OnCoinBodyEntered(node);

    Is there more I have to do?

    I will have another look at it. I'll report back.

    It works when listening to BodyEntered instead of AreaEntered. It's not clear why it does not work with Area entered. My Player also has Area2D children:

    CharacterBody2D (Player)
      - CollisionShape2D
      - Sprite2D
      - Area2D
          - CollisionShape2D
      - Area2D
          - CollisionShape2D
    
    Area2D (Coin)
      - CollisionShape2D

    I would expect that touching an Area2D area of the player would trigger an AreaEntered event in the coin. They have a slightly bigger collision shape than the CharacterBody2D. I'm getting only a BodyEntered event probably triggered by the CharacterBody2D collision shape. Is this the expected behavior?

    PatrickKunz public override void _Ready()
    {
    area = GetNode<Area2D>("Area2D");
    area.AreaEntered += (node) => OnCoinBodyEntered(node);
    }
    ...
    public void OnCoinBodyEntered(Node2D body)
    {
    GD.Print($"OnCoinBodyEntered {body.Name}");
    QueueFree();
    }

    Is the name of the node Area2D? and are you getting this in the player script?

    I believe GetNode would return a child of the node the script is attached to.
    Also, AreaEntered is for when an Area enters the Area.

      Jesusemora Sorry for the confusion. This is in the coin script. The coin scene had a root Node2D. The area2D was a child:

      - Coin
        - Area2D (Coin)
          - CollisionShape2D

      I have changed this in the meantime. The root node is not required. All works for me now and I can live with BodyEntered in Area2D for my coins and enemies. I can define multiple areas in the enemy scene/node to find out where the player hits them.

      I wanted to find out which part of the player hits the enemy with the Area2D of the player. This didn't work for me, because I didn't get the AreaEntered event on the coin Area2D. Now the enemy is responsible for where the player hits them. It works that way.

      I just wonder why the Area2D of the player does not trigger AreaEntered in the coins Area2D. Both have monitoring enabled and the collision masks should be right. Only BodyEntered triggers.

        Yes, Moniterable and Monitoring are enabled. I hope I find the time to do a test project that shows the behavior.

        After some refactoring, it works now. I'm not sure what the problem was. Probably a collision layer mismatch and maybe a runtime error that I didn't notice.
        I was now able to trigger an event when two Area2D collided. All good now. Thanks for your help.

          13 days later

          PatrickKunz I also just noticed (sorry i have been busy) that you were using "Area Entered" instead of "Body Entered." The "Entered" in the signal refers to WHAT is entering, not what it IS entering. That's an easy mistake. Glad you figured it out!