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.