Quick answer: Set input_ray_pickable = true. Confirm the active Camera3D, that the Area3D’s collision_layer is in viewport’s pick mask, and the world has process_unhandled_input wired up.
A 3D inventory grid uses Area3D nodes per item for click detection. Mouse clicks land on the items visually but no input_event signal fires. Picking isn’t enabled.
Pickable Flag
area.input_ray_pickable = true
Off by default. Without it, Area3D ignores mouse rays.
Camera + Viewport
The current Camera3D projects screen-to-world rays. Viewport must have a current camera set:
$Camera3D.current = true
Multiple cameras: only one current per viewport. Picking uses that one.
Connect input_event
area.input_event.connect(_on_area_input)
func _on_area_input(camera, event, pos, normal, shape_idx):
if event is InputEventMouseButton and event.pressed:
_pick_item(area)
Signal fires with intersection data. Filter for mouse button events.
Collision Layer Mask
Picking uses physics layers. The viewport’s default mask is all. If you scoped layers, ensure the Area3D’s collision_layer overlaps the camera’s pick mask (set via Project Settings → Physics).
UI Layer Intercept
A Control above the Area3D may consume the click. Either set mouse_filter = MOUSE_FILTER_IGNORE on the control, or use the input’s set_input_as_handled to forward.
Verifying
Click items in the inventory. Each fires input_event. Hovering shows different states. No clicks missed when Area3Ds are clearly under cursor.
“Pickable + current camera + connected signal. Three conditions for 3D click detection.”
For VR or game-controller cursors, drive picking via PhysicsDirectSpaceState3D.intersect_ray instead — explicit ray you control.