Applying forces recorded via OnCollisionStay2D to a second body does not replicate movement.

EDIT: I am a moron.

In case anyone else is a moron:

If you’re planning to record and transmit forces from the collisions of one body to another, make sure you record them in both OnCollisionStay and OnCollisionEnter. Otherwise you will, as I did, miss the all-important first impact where relative velocities tend to get resolved.

These are the impulse forces that Box2D applies, technically it’s not “how hard they are hit” but can be used as an approximation if taken as Newton’s Third Law i.e. equal and opposite reaction. Note that there’s Baumgarte Stabilization going on. Here’s the detail.

It’s also not something to do with which Unity callback or the ContactPoint2D struct. These are just the “messengers” here. If forces were wrong, then the physics engine wouldn’t work at keeping things separated. We don’t manipulate it, we just pass it along.

This is where Box2D stores the impulses: https://github.com/erincatto/box2d/blob/cd2c28dba83e4f359d08aeb7b70afd9e35e39eda/src/dynamics/b2_island.cpp#L276

This is the store that we read: https://github.com/erincatto/box2d/blob/cd2c28dba83e4f359d08aeb7b70afd9e35e39eda/src/dynamics/b2_contact_solver.cpp#L609

There’s also position correction going on in the physics engine.

Final note is that joint breakage reads this info and is used to compare against the limit.

Thanks for the detailed response - as I corrected my OP to reflect, however, the problem as usual lay between the chair and the keyboard.

Not a problem, glad you got it sorted.