Lerp() is a common source of confusion for newbies. Many (bad) “tutorials” use it in a careless way and don’t explain its actual function. It’s one of a few things I can claim to fully understand, so here we go.

Let’s just get this out of the way: all Mathf.Lerp() does is return a position half-way between two variables. In game development if you want to move something from a beginning point to an end point what you’re really talking about is applying linear interpolation to find a range of points that can be used for animation.

Interpolation takes a lot more than just a Lerp() method call. Here are the variables I’ll use to interpolate a variable over time:

-A reference to a variable that will animate.

-The value it starts moving from.

-The value it ends at.

-An amount of time it takes to reach the end.

-The amount of time that has passed.

-The position of the interpolation at a given percentage of that time passed..

Here is an academic example. In practice the startPosition would often be copied from a supplied movingFloat at the beginning of such a method.

IEnumerator Interpolation()
{
float startPosition = 0;
float endPosition = 100;
float movingFloat = 0;
float currentPosition = 0;
float percentComplete = 0;
float totalDuration = 5; // 5 seconds
for (float timePassed = 0; timePassed < totalDuration; timePassed += Time.deltaTime)
{
percentComplete = timePassed / totalDuration;
// percentComplete = percentComplete * percentComplete; // exponential curve
currentPosition = Mathf.Lerp(startPosition, endPosition, percentComplete);
movingFloat = currentPosition;
Debug.Log(movingFloat);
yield return 0;
}
}

Here’s a great article that helped me understand how to correctly write these methods.

I recommend beginners initially write their own interpolation methods. Creating methods like these myself was good practice; and led me to learn more advanced C# concepts as I searched for ways to make them more portable and generic. Ultimately, plugins like DOTween allow us interpolate anything with a choice of curve using one method call.

**Challenge: Can you make the interpolation more accurate? (Hint: use a while() loop and one if() statement.)**