Quick answer: Area3D.get_overlapping_bodies() returning [] right after spawn? Physics hasn’t ticked yet — wait one physics frame or query the PhysicsDirectSpaceState instead.

An Area3D’s overlap list is empty in _ready() even though bodies are clearly inside it. The physics server hasn’t produced the first overlap event yet.

One Physics Frame Lag

Area overlap lists are populated by the physics step. In _ready(), no step has run yet, so the list is empty. Schedule the query for the next frame:

await get_tree().physics_frame
var bodies = area.get_overlapping_bodies()

Force a Sync Query

var space = get_world_3d().direct_space_state
var params = PhysicsShapeQueryParameters3D.new()
params.shape = area_shape
var hits = space.intersect_shape(params)

Bypasses the deferred overlap signals — useful for immediate checks during setup.

monitor_able and monitoring

Both must be true on the Area3D and on the bodies’ collision shape. A common gotcha is collision_layer/mask not aligning — visualize with the Debug Collision overlay.

Verifying

The first query after the next physics frame returns the expected bodies. Spawning a body inside the area fires body_entered within one tick.

“Empty overlap list at spawn is timing. Wait one physics frame or query directly.”

For deterministic setup, route through direct_space_state — signals are great at runtime but unreliable at frame zero.