move character at constant speed, and detect collisions.

I have a terrain which isn’t flat.
and I have a capsule collider object.
I can move the object at a constant speed using the:

transform.Translate(Input.GetAxis("Horizontal") * Time.deltaTime * speed, 0, Input.GetAxis("Vertical") * Time.deltaTime * speed);

and the object moving on all the axis perfect, including the Y-axis, because of the rigidbody component reacting to the terrain collider.
the problem is: when I put a wall with Box Collider. and set my object’s rigidbody Collision detection to “Continuous dynamic”, it still goes through the wall on low FPS.
now i know there is another method to solve it, and the method is to move the object using “Rigidbody.Velocity = something.”
but the problem is that when you’re using Velocity, it disables the gravity on the object, and he just start floating when i’m moving down a mountain in my terrain.

what i’m trying to ask is there any way to move an object at a constant speed, without disabling its gravity(using velocity), and without teleporting it a little bit every frame (using transform.translate)
so it will be able to collide with the walls, even on very low FPS?


Two methods you can use to get past this.

Method 1

Rigidbody rb;
void Start () => rb = GetComponent<Rigidbody>();
void Update () => rb.MovePosition(transform.position + transform.forward * Time.deltaTime);

Method 2

void Update () => transform.position = Vector3.Lerp (transform.position, transform.position + transform.forward * Time.deltaTime, 1f);