For anyone ending up at this page based just on the subject heading (such as me!)…
I wanted a crossbow bolt to LookAt (the way it’s RigidBody is moving), so that the bolt would arc through the air as it goes up, and comes down, and also so that the bolt would visually look like it changed direction if it bounces off a surface.
I ended up with this line of code that worked perfectly for me…
transform.LookAt(transform.position + rb.velocity);
Further info for anyone interested, but really not necessary if the above line works for you! 
Note that the transform.LookAt function has 4 different variations, depending on what you pass in to it.
The one I use takes in just a WorldSpace position to LookAt. So I simply pass in a position that is where the bolt is, + it’s velocity vector.
For this particular case, I made a game object called Bolt, which has the Rigid Body and the BoltBehaviour.cs script. I didn’t want to be rotating the Rigid Body itself. I just wanted to let it do it’s thing.
So I made another child game object called “Mesh” which has the actual bolt Mesh and the Collider on it. I could then rotate this mesh and collider, without affecting the Rigid Body underlying it on the parent.
- Bolt (BoltBehaviour.cs, Rigid Body)
-
So the Bolt flies through the air, and the script updates the Mesh each frame to LookAt (transform + velocity).
…
PS: I have another function that would detect if the bolt has “come to a stand still” (by moving slowly enough), after which point, it no longer uses this LookAt function, as I wanted the bolt to become sort of an inert object at that point. So it just acts like any other “dumb” physics object at that point.