What's the best way to move a 3D rigidbody in Unity?

this feels like a ridiculous question after so many years of making 3D games,
I am mostly pointing towards characters and humanoids.

when it comes to CharacterController, it is without a doubt that CC.Move(); gives the most comfort solution to moving with easy control.
but in RigidBody MovePosition seems to work different.
I found the most common approach to be using rb.MovePosition(x, z) and for the y axis (jump, extra gravity, etc) to be .AddForce.

but on many cases (such as knockback, pushing the player) when trying to AddForce on the x,z axis it breaks the moveposition. which then leads to the question if it’s not better to just use AddForce for everything movement.

would love to hear your thoughts

Just in case anyone sees this in the future:

Conclusion:
It is without a doubt that the best way to move a character in Unity is by keeping a variable for the movement direction and multiplying another Movement velocity variable by it.

With character controller we usually move every update, so CC.Move() works great.
In RigidBody though, we have a perfect variable for it, rb.Velocity;

Moving with rb.MovePosition() can sabotage jumping, dashing and knockback, or any force with velocity that isn’t controlled by input, and addForce() gives us less control over the slipperiness part of the player (if we would want to add ice, air gliding, etc)

it seems that movePosition is best used as a shortcut function to rb.transform.position =, and addforce has it’s own uses.

for smaller games, anything works as long as it fits the game, this is just a strategy that I believe works for a large game that needs flexibility or a template for many different games.