WaveSpawner
i have a wave spawner script from a video i saw, since I'm fairly new to this still and its just more so a learning experience than anything really, but when spawning in the zombies im quite confused why the Wave Countdown is stuck and not counting down after i have killed them all to go onto another wave? the code for the wavespawner im using is
using UnityEngine; using System.Collections;
public class WaveSpawner : MonoBehaviour {
public enum SpawnState { SPAWNING, WAITING, COUNTING };
[System.Serializable]
public class Wave
{
public string name;
public Transform enemy;
public int count;
public float rate;
}
public Wave[] waves;
public int nextWave = 1;
public int NextWave
{
get { return nextWave + 1; }
}
public Transform[] spawnPoints;
public float timeBetweenWaves = 5f;
public float waveCountdown;
public float WaveCountdown
{
get { return waveCountdown; }
}
private float searchCountdown = 1f;
private SpawnState state = SpawnState.COUNTING;
public SpawnState State
{
get { return state; }
}
void Start()
{
if (spawnPoints.Length == 0)
{
Debug.LogError("No spawn points referenced.");
}
waveCountdown = timeBetweenWaves;
}
void Update()
{
if (state == SpawnState.WAITING)
{
if (!EnemyIsAlive())
{
WaveCompleted();
}
else
{
return;
}
}
if (waveCountdown <= 1)
{
if (state != SpawnState.SPAWNING)
{
StartCoroutine( SpawnWave ( waves[nextWave] ) );
}
}
else
{
waveCountdown -= Time.deltaTime;
}
}
void WaveCompleted()
{
Debug.Log("Wave Completed!");
state = SpawnState.COUNTING;
waveCountdown = timeBetweenWaves;
if (nextWave + 1 > waves.Length - 1)
{
nextWave = 0;
Debug.Log("ALL WAVES COMPLETE! Looping...");
}
else
{
nextWave++;
}
}
bool EnemyIsAlive()
{
searchCountdown -= Time.deltaTime;
if (searchCountdown <= 0f)
{
searchCountdown = 1f;
if (GameObject.FindGameObjectWithTag("Enemy") == null)
{
return false;
}
}
return true;
}
IEnumerator SpawnWave(Wave _wave)
{
Debug.Log("Spawning Wave: " + _wave.name);
state = SpawnState.SPAWNING;
for (int i = 0; i < _wave.count; i++)
{
SpawnEnemy(_wave.enemy);
yield return new WaitForSeconds( 1f/_wave.rate );
}
state = SpawnState.WAITING;
yield break;
}
void SpawnEnemy(Transform _enemy)
{
Debug.Log("Spawning Enemy: " + _enemy.name);
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length) ];
Instantiate(_enemy, _sp.position, _sp.rotation);
}
}
Can you test this change:
if (waveCountdown <= 0f) //0f instead of 1
{
if (state == SpawnState.COUNTING) //new condition
{
state = SpawnState.SPAWNING; //set state before doing StartCoroutine
StartCoroutine(SpawnWave(waves[nextWave]));
}
IEnumerator SpawnWave(Wave _wave)
{
Debug.Log("Spawning Wave: " + _wave.name);
//state = SpawnState.SPAWNING; //comment this line
If it works I think I can explain. It would be that the actual code in SpawnWave() is just added to a list to run later, so the coroutine can start twice. But it might be something else.
Can you also add the Debug.Log output?
I tried this and it didn't seem to work, if this is any help though i am using emerald AI so that might alo be it because of the events and im not so sure on how to exactly go about doing
also if the output you're asking is whats in the console, it says Wave 1 and spawning the 2 zombies i have in wave 1 but doesn't finish the Wave Completed part of it
Your answer
Follow this Question
Related Questions
How to show a "warning" effect before enemy spawns in a 2D shooter? 0 Answers
Wave Spawn Script not working? From Null to Destroy Object. 0 Answers
New wave always spawns with wrong amount of enemies / also does not delay 1 Answer
Wind zones unable to create waves rolling through foliage? Cant be! 0 Answers