Area3D Not Detecting RigidBody3D (but other Area3Ds do), Need help diagnosing inconsistent body_entered behavior

Godot Version

4.5.1.stable

Question

Hi everyone, I’ve been struggling with an Area3D that refuses to detect my RigidBody3D player, even though another Area3D in the same project (a checkpoint) detects it perfectly.

I’m making a 3D marble-style movement system where the player is a RigidBody3D rolling on the ground. I’m trying to create a Jump Pad using an Area3D, but the signal never detects.

Here are all the details.

player node setup:

The Marble has:

collision_layer = 2

It interacts correctly with my Checkpoint Area3D, so I know the layer/mask setup does work.

THE CHECKPOINT AREA (this one does detect the player)

My Checkpoint scene is an Area3D with:

collision_mask = 2

and its detection uses:

func _on_area_3d_body_entered(body: Node3D) -> void:
    if body.owner.is_in_group("player"):
        # Works correctly

This signal fires every time.

THE JUMP PAD AREA (this one does NOT detect the player)

Node Setup:

Script:

extends Area3D

@export var jump_force: float = 20.0

func _on_body_entered(body: Node3D) -> void:
    print("DETECTED:", body)   # Never prints
    if body.owner.is_in_group("player"):
        print("ACTIVATED!")

The signal is connected like this:

[connection signal="body_entered" from="." to="." method="_on_body_entered"]

Despite this, the function never runs.

MY QUESTION

What are the possible reasons an Area3D with the correct layer/mask, monitoring enabled, and a working signal connection would still completely fail to detect a RigidBody3D, while another Area3D with identical settings detects it perfectly?

Any insight or debugging advice would be greatly appreciated, as I’ve spent hours trying every known fix.

Thanks!

BTW here is the repo from where I got the base project, I was initially following a tutorial:

There’s no script on Area3D here. It also doesn’t show signal connection icon.

fixed it yet still no hopes ;-;

script:
extends Node3D

@export var jump_force: float = 20.0
@export var direction: Vector3 = Vector3.UP

func _on_area_3d_body_entered(body: Node3D) → void:
print(“JumpPad detected:”, body, " owner:", body.owner)

if body.owner and body.owner.is_in_group("player"):
	print("JumpPad ACTIVATED!")
	var marble := body as RigidBody3D
	if marble:
		marble.apply_central_impulse(direction.normalized() * jump_force)

Show the signal connection in gui. Also double check your collision layer/mask.

Are there any errors printed in the debugger/output?

For the player node the main node is a Node3D and RigidBody is the child of it, and its Collision Layer is set to 2, and the Collision Mask is 1.

No errors in the debugger/output about this.

image

Enable debug draw for collision shapes and visually check if all of your colliders are where you expect them to be. Maybe post a video of that.