2D Platformer Ep 30 | Enemy Keep Spawning

Updated on July 28, 2018 in [A] Brackeys Courses
Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Reddit0
1 on July 20, 2017

Hello guys,

I am beginner in using unity. Lately I followed the tutorial from Brackeys because I got interested in game development.

At the moment I have not found a way to stop enemies when the upgrade menu appears.

https://youtu.be/OEaU_mcYsRM?t=5m35s

Please someone help me.

Thank you

WaveSpawner Code.

 

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 Wave[] waves;
 private int nextWave = 0;
 public int NextWave
 {
     get { return nextWave + 1; }
 }
 public Transform[] spawnPoints;
[SerializeField]
 private GameObject upgradeMenu;
public float timeBetweenWaves = 5f;
 private float waveCountdown;
public float WaveCountdown
 {
     get { return waveCountdown + 1; }
 }
 
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 References");
     }
     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()
 {
     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);
        //if (upgradeMenu.activeSelf) yield return new WaitWhile(() => upgradeMenu.activeSelf);
        yield return new WaitForSeconds(1f / _wave.rate);
    }
    state = SpawnState.WAITING;
    yield break;
 }
 
void SpawnEnemy(Transform _enemy)
 {
     Debug.Log("Spawning Enemy : " + _enemy.name);
    if (spawnPoints.Length == 0) {
         Debug.LogError("No Spawn Points References");
     }
    Transform _sp = spawnPoints[Random.Range(0, spawnPoints.Length)];
     Instantiate(_enemy, _sp.position, _sp.rotation);
}
}
  • Liked by
Reply
0 on July 28, 2018

It may be a bit late but you can add a while loop inside your for loop: Change

 for (int i = 0; i < _wave.count; i++)     {         SpawnEnemy(_wave.enemy);        //if (upgradeMenu.activeSelf) yield return new WaitWhile(() => upgradeMenu.activeSelf);        yield return new WaitForSeconds(1f / _wave.rate);    }From macalov

 to

for (int i = 0; i < _wave.count; i++)
{
while (!this.enabled) {yield return null};
SpawnEnemy(_wave.enemy);
yield return new WaitForSeconds(1f / _wave.rate);
}

While the wavespawner is deactivated no enemies can spawn. And if one spawns you can set its rigidbody to sleep. One problem that comes with this is, that the velocity the enemy had is now gone but in my case this isn’t that much of a problem.

​​​​​if (this != null) {
if (GetComponent<Rigidbody2D>() != null) {
GetComponent<EnemyAI>().enabled = !active; GetComponent<Rigidbody2D>().Sleep();
}
}

I hope I could have helped you!

  • Liked by
Reply
Cancel