Spawning one by one problem?

How can i get this to spawn one object then after a surtan amount of time spawn another object.

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

    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.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;
    }
}

That’s close enough. First, there is a spawn cycle, you should use a coroutine or Invoke( “Spawn”, cycle).

Your queue already contains instances of those entities, so the spawning should just be dequeueing one instance and making it active. Here, you look up the end, add a new one, then empty the queue every frames with Peek. That’s odd.