When I press S to make the box move faster downward, the box doesn't stop when it hit another box, why?

Setting is 2D.
Box has 2dcollider and rigidbody kinematic = true.
Box is falling automatically(scripted), although I can press down to move it faster than scripted.
All my movement use Vector3.Lerp, coded in this format:

transform.position = Vector3.Lerp (transform.position, targetPos, t);

I decided to do without physics so falling boxes will just stack over and not bounce around, slide or move sideways ( especially when hit by another box sideways).

my initial goal to let them stack over each other is working. I put a raycast2d in the box.

if(hit){
        if (hit.collider.tag == "box") {
            canControl = false;
            canMove = false;
            //spawn a new box
            canSpawn();
        }
} else {
     //when is is hitting nothing anymore, it will continue it journey downward.
     canMove = true;
}

Problem: When I press down, the box pass through other boxes and not stop at the top of the box.

Is Lerp the problem here?That is, when the box moves using lerp from point A to B, it does not really traverse the points between A and B, hence when a box is positioned between point A and B, the moving box that has a raycast will not hit the box?

And if so, what movement should I do?

Changing a physics object’s position directly through transform.position will break the physics simulation. It’s not just a Unity thing, it’s a common feature of many physics engines.

In a physics engine the movements of objects are simulated based on their weight and speed etc. over time. If you manually suddenly set an objects position, that object will just teleport to that position without any interaction with the rest of the world. In the next update loop the simulation will continue from that setup and physics-crazyness ensues.

You should move physics objects by changing their speed or adding forces to them, or by using Rigidbody.MovePosition()