Quick answer: Add a velocity-proportional damping term to the buoyancy and clamp how far above the surface the body can rise, turning the spring into a settled float.
Buoyant swimming should settle the player at the waterline, not pogo through it. An undamped buoyancy spring oscillates forever. Add damping. Here is how.
How to fix it
1. Add damping to the buoyancy
Model buoyancy as a spring proportional to submerged depth, then subtract a term proportional to vertical velocity (-damping * velocity.y). The damping bleeds off the overshoot energy so the body settles.
2. Clamp emergence above the surface
Limit how far the body can rise above the waterline so a momentary upward force does not launch the player clear of the water and back into a full fall.
3. Scale drag with submersion
Apply higher linear drag while submerged than in air. Water resistance naturally damps motion and keeps the float from feeling springy or weightless.
Catching the ones you can't reproduce
The hardest version of this to fix is the one you can't reproduce — it only happens on a player's hardware, OS, driver, or save state, under conditions that simply aren't present on your machine. A report that says “it crashed” or “it froze” gives you nothing to act on, so the bug survives release after release while quietly costing you players.
Automatic error capture closes that gap. Each failure arrives with its full stack trace, the device and OS, the build number, and a breadcrumb trail of what the player did right before it broke, so even a failure you have never seen becomes a specific, reproducible issue. Fold identical failures into one signature ranked by how many players each hits, and your worklist sorts itself worst-first instead of arriving as a stream of vague complaints.
This is where a tool like Bugnet earns its place. Its SDK captures every error automatically with the full stack trace plus device, OS, memory, build, and game-state context, folds duplicates into one grouped issue with an occurrence count, and ties each to the build it first appeared on — so you fix the problem that hurts the most players first and confirm it is gone when its signature disappears from the next release.
A crash you can name from its stack trace is a crash you can usually fix in minutes.