How to spawn enemy wave by wave?

Hi guys, i have implemented Corrupter heart’s enemy spawner successfully but unfortunely i do not know how to make it to spawn the creep wave by wave and level by level means wave 2 spawn medium, wave 3 spawn hard and so on. Below is the script

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Spawner : MonoBehaviour {

	   
 
	public Transform destination = null;

	// Color of the gizmo
	public Color gizmoColor = Color.red;
 
	//-----------------------------------
	// All the Enums
	//-----------------------------------
	// Spawn types
	public enum SpawnTypes
    {
		Normal,
		Once,
		Wave,
		TimedWave
    }
	// The different Enemy levels
	public enum EnemyLevels
    {
		Easy,
		Medium,
		Hard,
		Boss
    }
	//---------------------------------
	// End of the Enums
	//---------------------------------
 
	// Enemy level to be spawnedEnemy
	public EnemyLevels enemyLevel = EnemyLevels.Easy;
 
	//----------------------------------
	// Enemy Prefabs
	//----------------------------------
	public GameObject EasyEnemy;
	public GameObject MediumEnemy;
	public GameObject HardEnemy;
	public GameObject BossEnemy;
	private Dictionary<EnemyLevels, GameObject> Enemies = new Dictionary<EnemyLevels, GameObject>(4);
	//----------------------------------
	// End of Enemy Prefabs
	//----------------------------------
 
	//----------------------------------
	// Enemies and how many have been created and how many are to be created
	//----------------------------------
	public int totalEnemy = 10;
	private int numEnemy = 0;
	private int spawnedEnemy = 0;
	//----------------------------------
	// End of Enemy Settings
	//----------------------------------
 
 
	// The ID of the spawner
	private int SpawnID;
 
	//----------------------------------
	// Different Spawn states and ways of doing them
	//----------------------------------
	private bool waveSpawn = false;
	public bool Spawn = true;
	public SpawnTypes spawnType = SpawnTypes.Normal;
	// timed wave controls
	public float waveTimer = 30.0f;
	private float timeTillWave = 0.0f;
	//Wave controls
	public int totalWaves = 5;
	private int numWaves = 0;
	//----------------------------------
	// End of Different Spawn states and ways of doing them
	//----------------------------------
	void Start()
	{
		// sets a random number for the id of the spawner
		SpawnID = Random.Range(1, 500);
		Enemies.Add(EnemyLevels.Easy, EasyEnemy);
		Enemies.Add(EnemyLevels.Boss, BossEnemy);
		Enemies.Add(EnemyLevels.Medium, MediumEnemy);
		Enemies.Add(EnemyLevels.Hard, HardEnemy);
	}
	// Draws a cube to show where the spawn point is... Useful if you don't have a object that show the spawn point
	void OnDrawGizmos()
	{
		// Sets the color to red
		Gizmos.color = gizmoColor;
		//draws a small cube at the location of the gam object that the script is attached to
		Gizmos.DrawCube(transform.position, new Vector3 (0.5f,0.5f,0.5f));
	}
	void Update ()
	{
		if(Spawn)
		{
			// Spawns enemies everytime one dies
			if (spawnType == SpawnTypes.Normal)
			{
				// checks to see if the number of spawned enemies is less than the max num of enemies
				if(numEnemy < totalEnemy)
				{
					// spawns an enemy
					spawnEnemy();
				}
			}
			// Spawns enemies only once
			else if (spawnType == SpawnTypes.Once)
			{
				// checks to see if the overall spawned num of enemies is more or equal to the total to be spawned
				if(spawnedEnemy >= totalEnemy)
				{
					//sets the spawner to false
					Spawn = false;
				}
				else
				{
					// spawns an enemy
					spawnEnemy();
				}
			}
			//spawns enemies in waves, so once all are dead, spawns more
			else if (spawnType == SpawnTypes.Wave)
			{
				if(numWaves < totalWaves + 1)
				{
					if (waveSpawn)
					{
						//spawns an enemy
						spawnEnemy();
					}
					if (numEnemy == 0)
					{
						// enables the wave spawner
						waveSpawn = true;
						//increase the number of waves
						numWaves++;
					}
					if(numEnemy == totalEnemy)
					{
						// disables the wave spawner
						waveSpawn = false;
					}
				}
			}
			// Spawns enemies in waves but based on time.
			else if(spawnType == SpawnTypes.TimedWave)
			{
				// checks if the number of waves is bigger than the total waves
				if(numWaves <= totalWaves)
				{
					// Increases the timer to allow the timed waves to work
					timeTillWave += Time.deltaTime;
					if (waveSpawn)
					{
						//spawns an enemy
						spawnEnemy();
					}
					// checks if the time is equal to the time required for a new wave
					if (timeTillWave >= waveTimer)
					{
						// enables the wave spawner
						waveSpawn = true;
						// sets the time back to zero
						timeTillWave = 0.0f;
						// increases the number of waves
						numWaves++;
						// A hack to get it to spawn the same number of enemies regardless of how many have been killed
						numEnemy = 0;
					}
					if(numEnemy >= totalEnemy)
					{
						// diables the wave spawner
						waveSpawn = false;
					}
				}
				else
				{
					Spawn = false;
				}
			}
		}
	}          
	// spawns an enemy based on the enemy level that you selected
	private void spawnEnemy()
	{
		GameObject Enemy = (GameObject) Instantiate(Enemies[enemyLevel], gameObject.transform.position, Quaternion.identity);
		NavMeshAgent n = Enemy.GetComponent<NavMeshAgent>();
        n.destination = destination.position;
		Enemy.SendMessage("setName", SpawnID);
		// Increase the total number of enemies spawned and the number of spawned enemies
		numEnemy++;
		spawnedEnemy++;
		
	}
	// Call this function from the enemy when it "dies" to remove an enemy count
	public void killEnemy(int sID)
	{
		// if the enemy's spawnId is equal to this spawnersID then remove an enemy count
		if (SpawnID == sID)
		{
			numEnemy--;
		}
	}
	//enable the spawner based on spawnerID
	public void enableSpawner(int sID)
	{
		if (SpawnID == sID)
		{
			Spawn = true;
		}
	}
	//disable the spawner based on spawnerID
	public void disableSpawner(int sID)
	{
		if(SpawnID == sID)
		{
			Spawn = false;
		}
	}
	// returns the Time Till the Next Wave, for a interface, ect.
	public float TimeTillWave
	{
		get
		{
			return timeTillWave;
		}
	}
	// Enable the spawner, useful for trigger events because you don't know the spawner's ID.
	public void enableTrigger()
	{
		Spawn = true;
	}
}

2 Answers

2

Look at this, I made a fully functionable enemySpawner wave by wave, just wanted to share it with you :wink:
All is working fine, just the setDifficulty part is not implementet yet.

Hope it helps :wink:

	public GameObject enemy;
	
	private bool waveActive = false;
	
	public Transform[] spawnPointRoot;
	
	private int waveLevel = 0;
	private float diffucultyMultiplier = 1.0f;
	private float intermissionLength = 10f;
	private int enemyCount = 0;
	private ArrayList enemies;
	private bool allEnemiesSpawned = false;
	
	private float velocity = 4f;
	private float health = 20f;
	private int enemyAmount = 10;
	private float spawnIntervall = 2;
	
	private GUIScript gui;
	
	public enum GameState {
		preStart,
		activeWave,
		intermission
	}
	
	GameState state = GameState.preStart;
	
	void Start(){
		enemies = new ArrayList();
		gui = Camera.main.GetComponentInChildren<GUIScript>();
	}
	
	void Update () {
		switch(state){
			
			case GameState.preStart:
				if(gui.startWave){
					setNextWave();
					startNewWave();
					gui.startWave = false;
				}else {
					
				}
			break;
			
			case GameState.activeWave:
				if(enemyCount == 0 && waveActive && allEnemiesSpawned){
					finishWave();
				}
			break;
			
			case GameState.intermission:
			break;
		}
	}
	
	void LateUpdate(){
		for(int i = 0; i < enemies.Count; i++){
			if((GameObject)(enemies*) == null){*

_ enemies.Remove(enemies*);_
_
}_
_
}_
_
enemyCount = enemies.Count;_
_
}*_

* void setNextWave(){*
_ diffucultyMultiplier = (diffucultyMultiplier * waveLevel) / 2;_
* }*

* void startNewWave(){*
* state = GameState.activeWave;*

* StartCoroutine(StartMission(1.5f));*

* waveLevel++;*
* }*

* IEnumerator InterMission(float seconds){*
* yield return new WaitForSeconds(seconds);*
* setNextWave();*
* startNewWave();*
* }*

* IEnumerator EnemySpawnerRoutine(float spawnIntervall, int enemyAmount, float velocity, float health){*
* for(int i = 0; i < enemyAmount; i++){*
* spawnNewEnemy(velocity, health);*
* yield return new WaitForSeconds(spawnIntervall);*
* }*
* allEnemiesSpawned = true;*
* }*

* void finishWave(){*
* StartCoroutine(“InterMission”,intermissionLength);*
* state = GameState.intermission;*
* waveActive = false;*
* }*

* void spawnNewEnemy(float velocity, float health){*
* GameObject e = (GameObject) Instantiate(enemy, new Vector3(0,0,0), Quaternion.identity);*
* EnemyScript es = e.GetComponentInChildren();*
* int i = Random.Range(0,2);*
_ es.setWaypoints(spawnPointRoot*);
es.maxHealth = health;
es.currHealth = health;
es.speed = velocity;
enemyCount++;
enemies.Add(e);
}*_

* IEnumerator StartMission(float seconds){*
* yield return new WaitForSeconds(seconds);*

* allEnemiesSpawned = false;*

* StartCoroutine(EnemySpawnerRoutine(spawnIntervall,enemyAmount,velocity,health));*

* waveActive = true;*
* }*

Hey there, no problem, it may be usefull to look at the StartCoroutine things! But anyway, your are checking: if (Time.time <= 1.0f) Instead try this: if(Time.time >= lastSpawnedEnemy){ // spawn enemy here lastSpawnedEnemy = Time.time + spawnintervallTime; } you get the point? Your are checking if Time.time is greater than 1.0f, Time.time will ever be greater than 1. Hope I could help!

Hey there thanks alot im able to spawn script by following your method but how do i stop it from spawning continuously? if my intention is just to spawn one time?

Can you put a demo on how your enemies wave work?

ITS GIVING ME error of typr or namespace GUI Script could not be found

private GUIScript gui;
is not working i have used ‘using UnityEngin.UI;’
is there anything else i need to add to it?

@felixpk