How do i spawn object after it has been destroyed?

Hello i have this script that works great but it does not re-spawn when the object it is spawning is destroyed. I would like it if 2 objects are destroyed to spawn another 2 right away so we always have the same amount of objects in the scene. here is the code so far.

  using UnityEngine;
  using System.Collections.Generic;

  public class PlatformManager : MonoBehaviour {

  public Transform prefab;
  public int numberOfObjects;
  public float recycleOffset;
  public Vector3 minSize, maxSize, minGap, maxGap;
  public float minY, maxY;

  private Vector3 nextPosition;
  private Queue<Transform> objectQueue;

   void Start () {
	objectQueue = new Queue<Transform>(numberOfObjects);
	for(int i = 0; i < numberOfObjects; i++){
		objectQueue.Enqueue((Transform)Instantiate(prefab));
	}
	nextPosition = transform.localPosition;
	for(int i = 0; i < numberOfObjects; i++){
		Recycle();
	}
}

void Update () {
	if(objectQueue.Peek().localPosition.x + recycleOffset < Runner.distanceTraveled){
		Recycle();
	}
}

private void Recycle () {
	Vector3 scale = new Vector3(
		Random.Range(minSize.x, maxSize.x),
		Random.Range(minSize.y, maxSize.y),
		Random.Range(minSize.z, maxSize.z));

	Vector3 position = nextPosition;
	position.x += scale.x * 0.5f;
	position.y += scale.y * 0.5f;

	Transform o = objectQueue.Dequeue();
	o.localScale = scale;
	o.localPosition = position;
	objectQueue.Enqueue(o);

	nextPosition += new Vector3(
		Random.Range(minGap.x, maxGap.x) + scale.x,
		Random.Range(minGap.y, maxGap.y),
		Random.Range(minGap.z, maxGap.z));

	if(nextPosition.y < minY){
		nextPosition.y = minY + maxGap.y;
	}
	else if(nextPosition.y > maxY){
		nextPosition.y = maxY - maxGap.y;
	}
}
    }

If you don’t mind them turning up later on - when it’s time to fit one in to the right slot then this would do it:

void Update () {
   if(objectQueue.Peek() == null)
   {
         Transform newOne;
         objectQueue.Dequeue();
         objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
         newOne.gameObject.SetActiveRecursively(false);
         nextPosition = transform.localPosition;
   }
    if(objectQueue.Peek().localPosition.x + recycleOffset < Runner.distanceTraveled){
       Recycle();
    }

}

private void Recycle () {
    Vector3 scale = new Vector3(
       Random.Range(minSize.x, maxSize.x),
       Random.Range(minSize.y, maxSize.y),
       Random.Range(minSize.z, maxSize.z));

    Vector3 position = nextPosition;
    position.x += scale.x * 0.5f;
    position.y += scale.y * 0.5f;

    Transform o = objectQueue.Dequeue();
     if(!o.gameObject.active)
          o.gameObject.SetActiveRecursively(true);
    o.localScale = scale;
    o.localPosition = position;
    objectQueue.Enqueue(o);

    nextPosition += new Vector3(
       Random.Range(minGap.x, maxGap.x) + scale.x,
       Random.Range(minGap.y, maxGap.y),
       Random.Range(minGap.z, maxGap.z));

    if(nextPosition.y < minY){
       nextPosition.y = minY + maxGap.y;
    }
    else if(nextPosition.y > maxY){
       nextPosition.y = maxY - maxGap.y;
    }
}

Create/edit a script that you attach to the projectile prefab, and add a function OnDestroy(). In it, you can put any code that gets executed as soon as the projectile is destroyed. For example, you could decrease a counter in your PlatformManager (and then react to that in PlatformManager’s Update(), or immediately spawn a new Projectile, etc…