To be clear, this has nothing to do with triggers or non-triggers nor do you have to add a Rigidbody2D to every collider as some fixed rule. I’ve tried to explain it a few times above and granted it might be better with a picture (that I don’t have)!
I’ll try to be clearer; Collider2D live in the space of the Rigidbody2D. For example, all the vertices of a BoxCollider2D are stored as a relative position from the Rigidbody2D. When you XY-position or Z-rotate the Rigidbody2D, the colliders attached to it do not require any attention so it’s fast as it’s only the Rigidbody2D that moves. However, if you adjust the collider offset or if the Collider2D lives on a child GameObject relative to the Rigidbody2D and you modify the Unity Transform inbetween the Rigidbody2D and Collider2D (the one on the Rigidbody2D is obviously fine to modify) then you’ve changed the relative position of the Collider2D with respect to the Rigidbody2D. Box2D is fairly immutable for stuff like this and such a change requires that the collider be destroyed and recreated so this is what we have to do.
When you animate the Transform XY-position or Z-rotation on a GameObject that has a Rigidbody2D and a Collider2D, we know to ignore all the Collider2D on that GameObject and only adjust the Rigidbody2D because of the above. Likewise, if we had a GameObject that has a Rigidbody2D but the Collider2D is on a child GameObject and we animated the Transform XY-position or Z-rotation of the Transform on the parent Rigidbody2D we would still ignore the Collider2D on the child GameObject because they have not changed position/rotation relative to the attached Rigidbody2D. In this parent/child split, if we were to instead animate the Transform on the child GameObject (that contained the Collider2D only) then we’re changing the relative position of the Collider2D with respect to its parent so it needs to be recreated in its new position.
Recreating a collider involves destroying it then creating it. When you destroy a collider, Box2D immediately removes all its contacts. Those contacts will be recreated in its new position during the next physics update. We then have to match up the old deleted contacts with the new incoming ones so we don’t end-up reporting new OnCollisionEnter2D or OnTriggerEnter2D which is a real PITA to do and has been the source of bugs in the past.
When you have a rag-doll set-up where you typically have colliders in a hierarchy of GameObject, some of which you animate XY-position or Z-rotation then you need to have a Kinematic Rigidbody2D at those GameObject which you animate. You do not need to have a Rigidbody2D at every GameObject, just ones where you animate.
Also, Kinematic Rigidbody2D automatically move relative to any parent Kinematic Rigidbody2D so modifying a root Rigidbody2D causes all children Rigidbody2D to move relative to it as you would expect in a normal Transform hierarchy; in this case it’s also a Kinematic Rigidbody2D hierarchy as well but the difference being that there isn’t a need to have a Rigidbody2D at every Transform position in that hierarchy, just the animate ‘joint’ positions.
Finally, I’d like to add that amongst the plans this year is to investigate making major modifications to Box2D rather than living with its shortcomings. One of which is to remove/reduce the need to recreate a Collider2D if you transform it relative to its Rigidbody2D. The other is to either defer recreation of Collider2D and therefore the contacts and/or allow the contacts to be updated immediately, either by a global option or per-Collider2D/Rigidbody2D.
That’s it!
Hope this explanation helps.