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.