- Home /
Answer by superpig · May 07, 2011 at 11:50 AM
It's a plain old function, so it 'works' anywhere - in that it will correctly calculate a value that is the linear interpolation between the start and end values. I use it, for example, in my AI code to compute how 'audible' a sound is based on how far away it is.
However, most of the time, when people are using Lerp(), they're trying to achieve smooth movement from point A to point B. To get smooth movement, you need to recompute the position very frequently - every frame, if possible.
Update() is called every frame, so you could call it there. You could also write a coroutine that does work every frame and calls it:
IEnumerator MoveObject(Vector3 source, Vector3 target, float overTime)
{
float startTime = Time.time;
while(Time.time < startTime + overTime)
{
transform.position = Vector3.Lerp(source, target, (Time.time - startTime)/overTime);
yield return null;
}
transform.position = target;
}
The advantage of doing it in a coroutine is that when the object isn't moving, the coroutine isn't running, which can save Unity a bit of time; by comparison, if you put the code in Update, Unity will always call Update, even if you end up not doing anything for the frame.
Also, with the coroutine approach, you can (if you wish) trade smoothness for framerate by yielding a WaitForSeconds() object instead of null. The longer you WaitForSeconds(), the jerkier the movement will be, but the less frequently Unity will have to do the computation.
This question and answer helped me. But I also needed to know about calling an IEnumerator function with StartCoroutine as explained here.
Answer by Mike 3 · May 07, 2011 at 10:07 AM
It works wherever you want it to, it's a simple mathematical function, min + (max - min) * t
You can generally use it well in coroutines, where you have a fixed start and end, and increment the t value from 0 to 1
Quick example for a coroutine:
IEnumerator MoveTo(Vector3 position, float time) { Vector3 start = transform.position; Vector3 end = position; float t = 0;
while(t < 1)
{
yield return null;
t += Time.deltaTime / time;
transform.position = Vector3.Lerp(start, end, t);
}
transform.position = end;
}
can you give an example of how it might work with a coroutine?
done - i haven't checked it, but looks reasonable enough at second glance
Answer by Meltdown · May 07, 2011 at 09:36 AM
No, it is meant to be used within the Update() method.
so lerp does not work at all in a function outside? what if update calls a function outside with lerp in it
It is not meant to be used in Update. In fact it's generally better outside Update. http://answers.unity3d.com/questions/6949/can-someone-explain-how-using-time-deltatime-as-t-in-a-lerp-actually-works/6950#6950
ina, sure, Update() can call any external method. But any method that Update() calls will still run the context of the Update() method execution. Eric thanks for the informative post, interesting stuff!
Eric, I read your link but couldn't see from your answer why it's bad to call Lerp() inside Update(). Could you elaborate?
people tend to misuse it a lot, lerping from the current position to the target position, which ends up with a weird almost exponential decay movement, which is dependent on frame rate.