Why is this making an infinite loop?

Hello, I’m pretty sure this is making an infinte loop, but I can’t find out why. Please, any help? :smiley:

void DartSpawning ()
	{
		movingDart = Instantiate (dart, new Vector3 (xPosition, yPosition, -10f), Quaternion.Euler (90, 0, 0)) as GameObject;

		while (movingDart.transform.position.z != 20.5f) 
		{
			movingDart.transform.position = new Vector3 (movingDart.transform.position.x, movingDart.transform.position.y, movingDart.transform.position.z + dartSpeed);
		}

	}

To start with, your lines 5-8 should probably be in an Update() function. You’ll want to get rid of the while loop, too. And just update the position on each frame, when Update() is called.

As for why it’s an infinite loop? Maybe dartSpeed is 0?

In general, comparing floating point values for equality/inequality is not a good idea. Due to rounding and precision, how movement is scaled by Time.deltaTime, and many other reasons, chances are the value isn’t going to exactly equal a constant.

There are various ways of dealing with this. You can use the Mathf.Approximately function to see if a value is really close to your constant. This works well when you’re dealing specifically with rounding issues.

In your case you’re constantly increasing your z value, so rather than checking z = 20.5f you can check for z >= 20.5f since z will eventually be greater than 20.5 if not exactly 20.5. In this case you often want to force the final value back to the maximum value you want it to be.

Finally, as @jmonasterio pointed out, this sort of code should either be in Update where you execute one update per frame. Or you could put it in a Coroutine and yield during each iteration.