'How can i improve my time delayed MMO like mob spawner code?

I tried to make a mob spawner which does followings:

1) spawns pre-defined amount of mobs with time interval of choice
2) checks if spawned gameobject destroyed if so spawns new ones till it reaches maximum amount again

Code works but i still think there can be improvements i want it to be mmo like slot spawner with pre defined maximum mob amount and intervals between every spawn

Issues im having:

1) at start works properly by 5 sec intervals between spawns but sometimes after you delete gameobject next spawn in line spawns instantly or very quickly

    private void Start()
    {
       spawnedCount = gameObject.transform.childCount;
       if (spawnedCount != 6)
         isSpawning = false;
    }
    private void Update()
    {
        
            spawnedCount = gameObject.transform.childCount;
            if (!isSpawning && spawnedCount < maxSpawnCount + 1) // check if should start spawn status and if coroutine currently working already  isSpawning = false > yes you can can if you want to spawn or not  isSpawning = True > no it is already spawning you cant check anymore and send requests
            {
                isSpawning = true; // set spawning status to true 
                StartCoroutine(DelayedSpawn(delayInterval));
            }
        
    }

    IEnumerator DelayedSpawn(float delay)
    {
        yield return new WaitForSecondsRealtime(delay);            
        if (spawnedCount <= maxSpawnCount)
        {

            GetRandomZombie();  // gets random zombie prefab to instantiate          
            spawnedObj = Instantiate(PrefabToSpawn, new Vector3(gameObject.transform.position.x + Random.Range(-5f, 5), 0, gameObject.transform.position.z + Random.Range(-5f, 5)), transform.rotation);
            spawnedObj.transform.parent = gameObject.transform;
        }
                  
        if (spawnedCount <= maxSpawnCount )
            StartCoroutine(DelayedSpawn(delayInterval));
        else if (spawnedCount == 6)
        {
            isSpawning = false;
            yield break;
        }
        
    }


Solution 1:[1]

I would do this like this. It seems cleaner.

Also I would suggest GetRandomZombie() method to return a prefab. That would be cleaner as well.

A reminder: The game object with script that has the coroutine method is disabled/deleted somehow, unity gives an error and coroutine stops. You can solve this like this:

private void OnDisable() //To prevent the error
{
    StopAllCoroutines();
}

private void OnEnable() //To start the coroutine again whenever the spawner object is enabled again.
{
    StartCoroutine(DelayedSpawn());
}

private IEnumerator DelayedSpawn()
{
    while (true)
    {
        yield return new WaitForSecondsRealtime(delayInterval);

        if (gameObject.transform.childCount <= maxSpawnCount)
        {
            GetRandomZombie();  // gets random zombie prefab to instantiate
            spawnedObj = Instantiate(PrefabToSpawn, new Vector3(gameObject.transform.position.x + Random.Range(-5f, 5), 0, gameObject.transform.position.z + Random.Range(-5f, 5)), transform.rotation);
            spawnedObj.transform.parent = gameObject.transform;
        }
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Tar?k