Ease angle-of-attack when approaching surface

I’m facing a problem that goes slightly beyond my vector math knowledge. I have a swimming character approaching the ocean surface from below (see image). I have a function that locks the character to the wave surface when they reach it, letting them swim horizontally along the surface.

My problem is that I want to smooth their angle of approach so that the transition to horizonal swimming is invisible. Basically, as they get closer to the surface I need to “steal” Z-velocity and add it to X, so that their total speed is constant. What’s the best way to handle this in a third-person controller? Do I need to use Set Actor Location every tick, or is there a better way?