Quick answer: Both Area3Ds need monitoring and monitorable = true. Match collision_layer / collision_mask. Connect to area_entered, not body_entered. CollisionShape3D resources must be set.
Two Area3Ds overlap. Neither emits area_entered. The seer's monitoring is on, but the seen Area has monitorable disabled, so the seer doesn't see it.
The Symptom
Area-to-Area overlap doesn’t fire signals. Body-to-Area works, just not Area-to-Area.
The Fix
Sensor (Area3D - the seer):
monitoring: true # detect other Areas/Bodies
monitorable: true # can be seen too (optional but symmetric)
collision_mask: bit 3 # detect things on layer 3
Trigger (Area3D - the seen):
monitoring: false # doesn't need to see anything
monitorable: true # MUST be true to be seen
collision_layer: bit 3 # sits on layer 3
Connect the signal.
extends Area3D
func _ready() -> void:
area_entered.connect(_on_area_entered)
func _on_area_entered(other: Area3D) -> void:
print("Area entered: ", other.name)
Spawned-Inside Edge Case
area_entered fires only on transition. If a trigger spawns already overlapping a sensor, the signal doesn’t retroactively fire. Use get_overlapping_areas() in _ready for initial state.
Verifying
Drop two Area3Ds into a scene with overlapping shapes. Run; print should fire. Toggle monitorable off on one; print stops. Confirms each flag’s contribution.
“monitoring on seer. monitorable on seen. Layers match. area_entered fires.”
Related Issues
For Area2D body_entered, see Area2D signals. For physics interpolation, see interpolation.
Both flags. Layers align. Signals fire.