- Home /
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;
     }
 }
Answer by felixpk · Nov 14, 2013 at 02:08 PM
Look at this, I made a fully functionable enemySpawner wave by wave, just wanted to share it with you ;) All is working fine, just the setDifficulty part is not implementet yet.
Hope it helps ;)
     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[i]) == null){
                 enemies.Remove(enemies[i]);
             }
         }
         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<EnemyScript>();
         int i = Random.Range(0,2);
         es.setWaypoints(spawnPointRoot[i]);
         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;
     }
Hi bro thanks for your sharing but unfortunately im quite new to unity so couldnt understand much i found another way to solve part of my problem which is
 if (Time.time <= 1.0f) {
             // spawn
             GameObject g = (GameObject)Instantiate(teddy, transform.position, Quaternion.identity);
  
             // get access to the navmesh agent component
             Nav$$anonymous$$eshAgent n = g.GetComponent<Nav$$anonymous$$eshAgent>();
             n.destination = destination.position;
             
  
           
         }
         
         if (timeLeft <= 5.0f && Time.time <=1.0f) {
             // spawn
             GameObject g = (GameObject)Instantiate(teddy2, transform.position, Quaternion.identity);
  
             // get access to the navmesh agent component
             Nav$$anonymous$$eshAgent n = g.GetComponent<Nav$$anonymous$$eshAgent>();
             n.destination = destination.position;
but currently my problem is i spawning thousands of it and non-stop, how do i solve it?
Hey there, no problem, it may be usefull to look at the StartCoroutine things! But anyway, your are checking: if (Time.time
Ins$$anonymous$$d 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?
You can use for example an int to count the enemys you have spawned.
 void SpawnEnemy(){
  Instatntiate(..);
  enemyCount++;
 }
 
 void spawn$$anonymous$$anager(){
  if(enemyCount <= maxEnemies){
   SpawnEnemy();
  }
 }
Something like that would work. Otherwise look at my code I posted before, especially the party with:
  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;
     }
Answer by oranmooney · Jul 03, 2017 at 02:54 AM
private GUIScript gui; is not working i have used 'using UnityEngin.UI;' is there anything else i need to add to it?
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                