- Home /
Coroutine is jerky after exiting trigger zone
Hello! I have a script attached to the camera that follows the player and moves smoothly to another position when changing directions. The problem is that when exiting a trigger zone(during which the camera does not move) the coroutines move the camera in the opposite direction for a few frames before doing what they're supposed to. Debugging the camera position shows this(x axis):
cam pos 1.2
Exiting trigger
cam pos 1.2
cam pos 1.7
cam pos 1.5
...and after a few frames it decreases from 1.2 as it should from the beginning.
Note this only happens when i go through the trigger zone and exit on the other side. If i enter the trigger and exit on the same side it works well with no jerkiness. Here is the script with some pseudocode on the if statements:
public Transform player;
public Vector3 offset = new Vector3(2.5f, 1.5f, -7.0f);
public bool onTrigger = false; **//true on trigger enter and false on exit**
IEnumerator Smooth(Vector3 start, Vector3 end, float overTime)
{
float startTime = Time.time;
while (Time.time < startTime + overTime)
{
offset = Vector3.Lerp(start, end, (Time.time - startTime) / overTime);
yield return null;
}
offset = end;
}
void Update()
{
if ("NotFiring")
{
if ("moving backwards")
{
StartCoroutine(Smooth(offset, new Vector3(-2.5f, 1.5f, -7.0f), 0.2f));
}
else if ("moving forwards")
{
StartCoroutine(Smooth(offset, new Vector3(2.5f, 1.5f, -7.0f), 0.2f));
}
}
}
public void TriggerExit() **//activated on trigger exit**
{
if ("moving forwards")
StartCoroutine(Smooth(new Vector3(-2.5f, 1.5f, -7.0f), offset, 0.2f));
else if ("moving backwards")
StartCoroutine(Smooth(new Vector3(2.5f, 1.5f, -7.0f), offset, 0.2f));
}
private void LateUpdate()
{
if (onTrigger == false)
{
transform.position = player.position + offset;
}
}
Please help a noob!
Answer by chelupars · Mar 21, 2016 at 11:25 PM
After some fiddling i found a way to smooth the transition was to change the x values inside TriggerExit() from -2.5 to -2.0 and 2.5 to 2.0 Don't know why but it now works almost perfectly...