Stopping Vector3.Lerp

Hallo everybody,

I stumbled against a weird (in my eyes) problem while using Vector3.Lerp. If i place the lerp function inside an if statement which should control when the lerp should actually take place and when the object should stop, it does not behave like i want it to.

function Update () 
{	
	calculateDistance();
	
	if (canMove)
	{
		startMoving();
	}
}

function moveLetters(thisTransform : Transform, startPos : Vector3, endPos : Vector3, time : float)
{	
	var i = 0.0;
	var rate = 1.0/time;
	
	
	while(i <1.0)
	{	
		i += Time.deltaTime * rate;
		thisTransform.position = Vector3.Lerp(startPos, endPos, i);
		yield;
	}

}

function calculateDistance()
{	
	if(clonedLetter_1 != null)
	{
       distance_1 = Vector3.Distance(clonedLetter_1.transform.position,player.transform.position);
       distance = distance_1;
       
       if(distance < 5)
       {
       		canMove = true;
       } else if (distance > 5)
       	{
       		canMove = false;
       	}
       
       print(distance);
	}
}

function startMoving()
{
		
		if(clonedLetter_1 != null)
		{	
			moveLetters(clonedLetter_1.transform,clonedLetter_1.transform.position,target_1.transform.position,30.0);
			clonedLetter_1.transform.position.y = target_1.transform.position.y;
		}
		
		if(clonedLetter_2 != null)
		{
			moveLetters(clonedLetter_2.transform,clonedLetter_2.transform.position,target_2.transform.position,30.0);
			clonedLetter_2.transform.position.y = target_2.transform.position.y;
		}
		
		if(clonedLetter_3 != null)
		{
			moveLetters(clonedLetter_3.transform,clonedLetter_3.transform.position,target_3.transform.position,30.0);
			clonedLetter_3.transform.position.y = target_3.transform.position.y;
		}
}

The problematic if statement:

 if(distance < 5)
   {
   		canMove = true;
   } else if (distance > 5)
   	{
   		canMove = false;
   	}

I printed the results and canMove switches correctly between true and false. Distance also works correctly. The problem is, once the lerp is turned on, it wont stop, even though i have an if statement which should stop it each time the distance is bigger than 5. My question is if lerp is “update” independent (if such a thing exists) or if there is another to stop a Lerp movement.

I am fairly new to scripting so i bid my excuses if this is something obvious which i cant see to unravel.

Anyways, thanks in advance.

Hatzalex

hi hatzalex,

its easy and check your moving object reached end position means just break that loop…thats it… :slight_smile:

function moveLetters(thisTransform : Transform, startPos : Vector3, endPos : Vector3, time : float)
    {   
        var i = 0.0;
        var rate = 1.0/time;
    
    
        while(i <1.0)
        {  
           i += Time.deltaTime * rate;
           thisTransform.position = Vector3.Lerp(startPos, endPos, i);
           yield;
           if(startPos - endPos == Vector3.zero)
           {
             break;
           }
        }
    
    }

Try printing i, see if it ever becomes >1.0.

The time calculations in your moveLetters function looks suspicious to me… if rate is equal to 1.0 getting divided by time, then it will keep getting smaller and smaller… and if i is Time.deltaTime multiplied by a number that’s constantly getting smaller (and never >1.0) then I don’t think your while statement can escape.

Hello,

i’ve didn’t read here any idea about to use this one in FixedUpdate?

you can add the lerp code in FixedPause. After you set Timer.timeScale = 0, every method in fixed timescale will be on pause.
Just remember to add a code in update when you are in pause, in order to resume…

hopefully that helps, even after 5 years :slight_smile: