I'm trying to make the coroutine spawn one object at a time every 0.2 seconds, but when I run the coroutine, it spawns multiple objects at once without any delay. How can I fix this and achieve the desired result?
My code:
if (shotExtender > 0)
{
StartCoroutine("Timer");
}
else
{
StopCoroutine("Timer");
}
Coroutine
IEnumerator Timer()
{
while (objCounter < 3)//it should spawn only 3 objects
{
yield return new WaitForSeconds(0.2f);
GameObject bullet = PhotonNetwork.Instantiate(bulletPref.name, bulletPosition, Quaternion.identity);
objCounter ;
Debug.Log("objCounter: " objCounter " maxBullets: " maxBullets);
}
objCounter = 0;
shotExtender = 0;//This stops the coroutine
}
CodePudding user response:
Try taking out the object counter resetter and the shot extender resetter outside the coroutine. I believe that the if statement is being accessed multiple times generating multiple coroutines before the first one has even finished!
if (shotExtender > 0)
{
StartCoroutine("Timer");
objCounter = 0;
shotExtender = 0;//This stops the coroutine
}
CodePudding user response:
If this code runs inside the update
if (shotExtender > 0)
{
StartCoroutine("Timer");
}
else
{
StopCoroutine("Timer");
}
You must finish the condition before starting the process like this
if (shotExtender > 0)
{
shotExtender = 0;
StartCoroutine("Timer");
}
else
{
StopCoroutine("Timer");
}
CodePudding user response:
The answers above got me on the right track. I did everything as follows and it worked:
if (shotExtender > 0)
{
StartCoroutine("Timer");
}
.
IEnumerator Timer()
{
while (objCounter < maxBullets)
{
yield return new WaitForSeconds(0.2f);
GameObject bullet = PhotonNetwork.Instantiate(bulletPref.name, bulletPosition, Quaternion.identity);
shotCounter ;
Debug.Log("corutine works. objCounter: " objCounter " maxBullets: " maxBullets);
}
StopCoroutine("ShotTimer");
objCounter = 0;shotExtender = 0;
}