Created
December 27, 2016 18:16
-
-
Save Drenerdo/091d93e7766ca80f07189471be710ec4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 count; | |
public float rate; | |
} | |
public Transform[] spawnPoints; | |
public Wave[] waves; | |
private int nextWave = 0; | |
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) | |
{ | |
// Checking if enemies are still alive | |
if (!EnemyIsAlive()) | |
{ | |
// Begin a new round | |
Debug.Log("Wave Completed!"); | |
return; | |
} | |
else | |
{ | |
return; | |
} | |
} | |
if (waveCountdown <= 0) | |
{ | |
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 COMPLETED! 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("" + _wave.name); | |
state = SpawnState.SPAWNING; | |
for (int i = 0; i < _wave.count; i++) | |
{ | |
SpawnEnemy(_wave.enemy); | |
yield return new WaitForSeconds( 1f/_wave.rate ); | |
} | |
// Spawn | |
state = SpawnState.WAITING; | |
yield break; | |
} | |
void SpawnEnemy(Transform _enemy) | |
{ | |
Instantiate(_enemy, transform.position, transform.rotation); | |
Transform _sp = spawnPoints[Random.Range(0, spawnPoints.Length)]; | |
Debug.Log("Spawning Enemy: " + _enemy.name); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment