- Home /
How to send a reference to an instance
I am creating a laser defender game in unity and I have this problem where when I shoot the first enemy it takes me directly to the NextLevelMenu scene but I want it to load when all the enemies are killed. It seems to be that I have to send a reference to the instance of its spawner to every spawned enemy. How can I do this?
EnemySpawner script :
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
 
 public class EnemySpawner : MonoBehaviour {
 
     [SerializeField] GameObject EnemyPreFab;
     [SerializeField] int MaxEnemies = 30;
     [SerializeField] float EnemySpawnTime = 1.00001f;
     [SerializeField] GameObject FirstWaypoint;
     int CurrentNumOfEnemies = 0;
     public LevelManager myLevelManager;
     public int maximumnumberofhits = 0;
     public static EnemySpawner Instance = null;
     int timesEnemyHit;
 
     
 
 
     IEnumerator SpawningEnemies()
     {
         while(CurrentNumOfEnemies <= MaxEnemies)
         {
             GameObject Enemy = Instantiate(EnemyPreFab, this.transform.position, Quaternion.identity);
             CurrentNumOfEnemies++;
             yield return new WaitForSeconds(EnemySpawnTime);
         }
     }
 
     void Start()
     {
         if (Instance == null)
             Instance = this;
         StartCoroutine(SpawningEnemies());
         timesEnemyHit = 0;
         if (this.gameObject.tag == "EnemyHit")
         {
             CurrentNumOfEnemies++;
         }
 
         
     }
 
     public void OnEnemyDeath()
     {
         CurrentNumOfEnemies--;
         if (CurrentNumOfEnemies < 1)
         {
             // You killed everyone, change scene: 
             LaserLevelManager.LoadLevel("NextLevelMenu");
         }
     }
 
 
 }
EnemyShooter Script:
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class EnemyShooting : MonoBehaviour {
 
    
     [SerializeField] float EnemyLaserSpeed = 10f;
     [SerializeField] float EnemyLaserFireTime;
     [SerializeField] GameObject LaserBulletEnemyPreFab;
     [SerializeField] int MaxNumberOfHits = 1;
     
     int CurrentNumberOfHits = 0;
     Coroutine FireCoroutine;
 
     void OnTriggerEnter2D(Collider2D collider)
     {
         if(collider.gameObject.tag == "PlayerLaser")
         {
             if(CurrentNumberOfHits < MaxNumberOfHits)
             {
                 CurrentNumberOfHits++;
                 Destroy(collider.gameObject);
                 Score.ScoreValue += 2;//The user will be rewarded 1 point
             }
         }
     }
 
 
     void DestroyEnemy()
     {
         if(CurrentNumberOfHits >= MaxNumberOfHits)
         {
             Destroy(gameObject);
             EnemySpawner.Instance.OnEnemyDeath(); // Tell the EnemySpawner that someone died
 
         }
     }
 
     private void Fire()
     {
         FireCoroutine = StartCoroutine(ShootContinuously());
     }
 
     void BecomeVisible()
     {
         Fire();
     }
 
     IEnumerator ShootContinuously()
     {
         while (true)
         {
             GameObject LaserBulletEnemy = Instantiate(LaserBulletEnemyPreFab, this.transform.position, Quaternion.identity) as GameObject;
             LaserBulletEnemy.GetComponent<Rigidbody2D>().velocity = new Vector2(0, EnemyLaserSpeed);
             EnemyLaserFireTime = Random.Range(0.5f, 0.9f);
             yield return new WaitForSeconds(EnemyLaserFireTime);
         }
     }
     // Use this for initialization
     void Start () {
 
         BecomeVisible();
     }
     
     // Update is called once per frame
     void Update () {
 
         DestroyEnemy();
 
     }
 }
 
Answer by Temseii · May 08, 2019 at 08:37 PM
There's a direct conflict with the variable 'CurrentNumOfEnemies', which you're using as your loop condition and simultanously modifying 'OnEnemyDeath'. Create a new integer to check for the state of the game instead of using the same one.
  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;
  using UnityEngine.UI;
  
  public class EnemySpawner : MonoBehaviour {
  
      [SerializeField] GameObject EnemyPreFab;
      [SerializeField] int MaxEnemies = 30;
      [SerializeField] float EnemySpawnTime = 1.00001f;
      [SerializeField] GameObject FirstWaypoint;
      int CurrentNumOfEnemies = 0;
      int activeEnemies = 0;
      public LevelManager myLevelManager;
      public int maximumnumberofhits = 0;
      public static EnemySpawner Instance = null;
      int timesEnemyHit;
  
      
  
  
      IEnumerator SpawningEnemies()
      {
          while(CurrentNumOfEnemies <= MaxEnemies)
          {
              GameObject Enemy = Instantiate(EnemyPreFab, this.transform.position, Quaternion.identity);
              CurrentNumOfEnemies++;
              yield return new WaitForSeconds(EnemySpawnTime);
          }
      }
  
      void Start()
      {
          if (Instance == null)
              Instance = this;
          StartCoroutine(SpawningEnemies());
          timesEnemyHit = 0;
          activeEnemies = MaxEnemies;
          if (this.gameObject.tag == "EnemyHit")
          {
              CurrentNumOfEnemies++;
          }
  
          
      }
  
      public void OnEnemyDeath()
      {
          activeEnemies--;
          if (CurrentNumOfEnemies == MaxEnemies && activeEnemies <= 1)
          {
              // You killed everyone, change scene: 
              LaserLevelManager.LoadLevel("NextLevelMenu");
          }
      }
  
  
  }
Your answer
 
 
             Follow this Question
Related Questions
Code editor doesnt work,My scripts dont work! 1 Answer
Next Scene not loading after all enemies are destoryed 0 Answers
Simple - Visual Studio Code not loading script when icon is clicked through unity *Video provided* 0 Answers
PlayFab Question not being answered maybe here can help instead? 0 Answers
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                