How can i spawn one by one?

Hello there how can i get this script to spawn one by one, and not spawn all these objects at as time. also how can i spawn the objects so that they stay in my min and max area? thanks for your help. here is my code.

 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();
	}
}
  public int maxNumberOfObjects = 40; //Or whatever
 public float spawnDelay = 10f; //Delay between new ones
 float lastTime = 0;

  void Update () {
  if(objectQueue.Count < maxNumberOfObjects && Time.time - lastTime > spawnDelay)
 {
  Transform newOne;
  lastTime = Time.time;
  objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
  newOne.gameObject.SetActiveRecursively(false);
  }
  if(objectQueue.Peek() == null)
  {
 Transform newOne;
objectQueue.Dequeue();
objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
newOne.gameObject.SetActiveRecursively(false);
nextPosition = transform.localPosition;
}
            if(objectQueue.Peek().gameObject.active == false || 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;
	}
    }
    }

Instead of using

 if(objectQueue.Count < maxNumberOfObjects && Time.time - lastTime > spawnDelay)
 {
  Transform newOne;
  lastTime = Time.time;
  objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
  newOne.gameObject.SetActiveRecursively(false);
  }

try using

private float nextSpawn = 0.0f;

if(objectQueue.Count < maxNumberOfObjects && Time.time > nextSpawn)
{
  nextSpawn = Time.time + spawnDelay;
  Transform newOne;
  
  objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
  newOne.gameObject.SetActiveRecursively(false);
}

Haven’t tested it though

I would split the function into a Coroutine. Something like

public void Start(){
    StartCoRoutine("MyFunction",5);
}
IENumerator MyFunction(int spawnCount){
    for(i=0;i<spawnCount;i++;){
        yield return new WaitForSeconds(waitTimeInt);    
        Instantiate(etc,etc,etc,etc);
    }
}

Havn’t put that through an IDE so you’ll need to clean it up to fit your purpose. Main points are to use an IENumerator function and call it via a coroutine. A Numerator can sleep it’s thread using WaitForSeconds, which you can’t do in normal functions.