Question by
DrewWasTaken · Jan 08, 2020 at 09:33 AM ·
aienemy spawnwavesspawning-enemiestimers
Help with timed wave defense game
I am working on a Wave Defense Game where enemies are spawned from random locations and the player has to kill them all to progress further.
My main idea was to get 3 different enemy types and calculate after the end of each wave which ones were killed easiest and replace that one with a stronger enemy but can't think how I would calculate such a thing?
My next idea was to spawn enemies for 30 seconds and see which get killed easiest during that time. When the round ends some calculation is done and the weakest is replaced, but again I have no idea how to do such a thing?
This is what I have so far:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WaveSpawner : MonoBehaviour
{
public enum SpawnState { SPAWNING, WAITING, COUNTING };
[System.Serializable]
public class Wave
{
public string name;
public Transform[] enemy;
public int enemyCount;
public float spawnRate;
}
public Wave[] waves;
private int nextWave = 0;
public Transform[] spawnPoints;
public float timeBetweenWaves = 5f;
private float waveCountdown;
private float searchCountdown = 1f;
private SpawnState state = SpawnState.COUNTING;
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 <= 0)
{
if (state != SpawnState.SPAWNING)
{
StartCoroutine(SpawnWave ( waves[nextWave] ) );
}
}
else
{
waveCountdown -= Time.deltaTime;
}
}
void WaveCompleted() //Add Difficulty Multiplier For More Waves Here
{
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.enemyCount; i++)
{
SpawnEnemy(_wave.enemy);
yield return new WaitForSeconds(1f / _wave.spawnRate);
}
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);
}
}
Any help or information would be much appreciated
Comment