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();

	}
}

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");
         }
     }
 
 
 }