Quick answer: Override _IntegrateForces(PhysicsDirectBodyState3D state) on the body. Use the state passed in; don’t fetch outside.

Tried to read body state from _Process. Returns null. Outside the integration callback, state is unavailable.

The Fix

public partial class CustomBody : RigidBody3D {
    public override void _IntegrateForces(PhysicsDirectBodyState3D state) {
        // Read & modify here
        state.LinearVelocity = state.LinearVelocity * 0.99f;   // damping
        if (state.GetContactCount() > 0) {
            var p = state.GetContactLocalPosition(0);
        }
    }
}

The state parameter is engine-managed and only valid in this scope. Cache values to fields if you need them outside.

Verifying

Custom drag applies. Contact info reads correctly inside override.

“Inside _IntegrateForces. State alive.”

Related Issues

For RigidBody3D damp, see damp. For C# disposed after await, see disposed.

Inside override. State valid.