Question by
moisespirela · Aug 01, 2016 at 01:57 PM ·
spawnwaves
Enemy Spawner Crash
I keep getting a crash if I add an IF statement to verify enemies killed.
using UnityEngine;
using System.Collections;
public class SpawnManager : MonoBehaviour
{
public GameObject[] enemy;
public Transform spawnX;
public Transform spawnY;
//wave control
public int maxEnemy;
public int enemyCount;
public float spawnWait;
public float startWait;
public float waveWait;
private static int wave;
private int enemiesSpawned;
public static int enemiesKilled;
// end wave control
// Use this for initialization
void Start()
{
StartCoroutine(SpawnWaves());
wave = 1;
}
// Update is called once per frame
void Update()
{
Debug.Log(enemiesSpawned + " " + wave);
if (enemiesKilled == enemyCount)//THIS CAUSES THE CRASH, EVEN INSIDE THE IENUMERATOR
{
waveWait += Time.deltaTime;
if(waveWait >= 5)
GetNextWave();
}
}
IEnumerator SpawnWaves()
{
yield return new WaitForSeconds(startWait);
while (true)
{
if (enemiesSpawned <= maxEnemy)
{
for (int i = 0; i >= enemyCount; i++)
{
Vector3 spawnPosition = new Vector3(Random.Range(-spawnX.position.x, spawnX.position.x), Random.Range(-spawnY.position.y, spawnY.position.y), -3);
int enemyIndex = Random.Range(0, enemy.Length);
Instantiate(enemy[enemyIndex], spawnPosition, enemy[enemyIndex].transform.rotation);
enemiesSpawned++;
yield return new WaitForSeconds(spawnWait);
}
}
else
{ }
//yield return new WaitForSeconds(waveWait);
}
}
void SetNextWave()
{
wave++;
enemyCount = enemyCount * wave;
enemiesSpawned = 0;
enemiesKilled = 0;
}
void GetNextWave()
{
SetNextWave();
StartCoroutine(SpawnWaves());
}
}
Comment
Best Answer
Answer by Bunny83 · Aug 01, 2016 at 02:08 PM
You get the freeze because you have an infinite loop inside your coroutine without a yield statement.
if this if statement inside the coroutine is false:
if (enemiesSpawned <= maxEnemy)
you will not enter the for loop where you have a yield. So the while loop effectively looks like this:
while(true)
{
}
which is an infinite loop without breaking condition. To solve that problem just add at least a yield return null;
at the end of your while loop:
while(true)
{
// your other code
yield return null;
}