Quick answer: Use Area2D for trigger zones. StaticBody is for solid blocking; doesn’t emit body_entered.

Damage zone made with StaticBody2D. Player walks in, no signal. StaticBody is for physical collision; you want Area2D.

The Fix

SceneTree:
  DamageZone (Area2D)
    CollisionShape2D
    Connect: body_entered → _on_body_entered

# script
extends Area2D

func _on_body_entered(body: Node2D):
    if body.has_method("take_damage"):
        body.take_damage(10)

Area2D's monitor_entered/exited fire reliably for any PhysicsBody2D entering. StaticBody only blocks; doesn't notify.

Verifying

Player into Area2D: signal fires, take_damage runs. Without switch: signals never trigger.

“Trigger? Area. Block? Static.”

Related Issues

For Area2D fast mover, see CCD. For multiplayer sync, see sync.

Area for triggers. Static for walls.