So I tried to use a rigidbody instead of a character controller for my player and everything is fine, except something:
var multiplierVar : float = 1 * speed * Time.deltaTime * 100;
var walkDirection : Vector3 = transform.TransformDirection(Vector3(moveDirection.x * multiplierVar, rigidbody.velocity.y, moveDirection.z * multiplierVar));
var sprintDirection : Vector3 = transform.TransformDirection(Vector3(moveDirection.x * multiplierVar * 2, rigidbody.velocity.y, moveDirection.z * multiplierVar * 2) );
if(sprinting) rigidbody.velocity = sprintDirection;
else rigidbody.velocity = walkDirection;
This is what I basicaly use to move my player. I change directly the value of the velocity. The problem is that this way if I’m standing on a steep surface, my player won’t slip, or if I’m pushing a box or something, the object won’t slow down my player because the velocity is strongly set to be equal to my input.
Any idea how to fix this? I tirf with adding force and suming the velocity and the input, not making them equal, but then the player get’s pretty weak, he wouldn’t even climb stairs and his walking speed increases and decreases pretty slowly…it just doesn’t look good. So if anyone has ever used a rigidbody for such purpose, can you point me in the right direction?
Thanks in advance 
Look into rigidbody.AddRelativeForce() this may give you better results than setting the velocity directly.
A couple of things to look at…
relativeVelocity = transform.InverseTransformDirection(rigidbody.velocity);
movementSinceLastUpdate=relativeVelocity * Time.deltaTime;
These two variables could be used to give you the distance that you moved, or the amount of animation steps that should have progressed to move that speed.
Well I’ve tried both - AddForce and AddRelativeForce, the difference between them is that with AddForce I just need to convert the coordinates before I add them to the function and with AddRelativeForce, I just say in which direction my rigidbody should move. I didn’t get why would I need to know the distance I’ve moved. Can you be a little bit more speciffic? Thanks!
I’ve also tried to add a physics material so I can change the properties a little, but it didn’t help. 
relativeVelocity = transform.InverseTransformDirection(rigidbody.velocity);
movementSinceLastUpdate=relativeVelocity * Time.deltaTime;
I got it, those variables will help me keep the speed of the player at a certain value and not go over it (I’ll check if force should be added or not) but the movement itself is the problem. It’s too tardy and as I said, my player has difficulties when climbing stairs and such.