在运行时更改延迟生成 [C#]

Changing delay spawn at runtime [C#]

这是问题所在的代码:

public class EnemySpawnScript : MonoBehaviour {
    private float previousEnemyDelay = 0;

    public void enemySpawn (GameObject player, LevelData level){
        //loop every enemy inside the level to instantiate them. EnemyDataSpawn has got some infos about every enemy
        foreach (EnemyDataSpawn enemyDataSpawn in level.enemyDataSpawner) {
            StartCoroutine (InstantiateObject (player,enemyDataSpawn));
        }
    }

    IEnumerator InstantiateObject (GameObject player, EnemyDataSpawn enemyDataSpawn)
    {
        //this handles the delay of the spawn of every enemy. 
        previousEnemyDelay += enemyDataSpawn.delay;
        //here is the problem if i want to stop enemies to spawn and then continue to spawn them again.
        yield return new WaitForSeconds (previousEnemyDelay);
        //after waiting, i do something.
}

如果我只想在 enemyDataSpawn 内指定的延迟后实例化每个敌人,此代码有效(我没有编写 "instantiate enemy" 部分(我使用对象池来实现),位于 yield 之后IEnumerator,因为它对我的问题并不重要)。 问题是我对每种敌人都有一个整数(称为 maxOnScreen),如果具有相同名称的 ACTIVE 敌人的数量等于 maxOnScreen,那么我想停止实例化所有其他敌人,直到一个敌人(这活动数量等于 maxOnScreen) 将被停用或销毁。如果一个敌人不再被激活并且具有相同名称的活跃敌人的数量不再等于 maxOnScreen,那么我想再次实例化列表中的下一个敌人,因为我的实际代码已经这样做了。我不知道如何使用 IEnumerator 实现此目的,所以我的问题是:是否可以使用 IEnumerator 实现此目的,或者我应该使用其他一些方法?

简单示例:有 7 个敌人处于活动状态,3 个名为 "bad soldier",4 个名为 "good soldier"。 good soldier 的 maxOnScreen 变量是“4”,所以我不希望其他敌人实例化,除非 "good soldier" 之一是 destroyed/deactivated。如果活动的总数 "good soldier" 是 3(再次小于 maxOnScreen),我希望游戏继续生成剩余的敌人。

提前致谢

您可以使用单个生成敌人的协程,而不是为要生成的每个敌人启动每个协程。这样您就可以轻松控制何时生成敌人以及何时延迟其生成:

public class EnemySpawnScript : MonoBehaviour {

public void enemySpawn (GameObject player, LevelData level){
    StartCoroutine(InstantiateObjects(player, level.enemyDataSpawner));
    }

    IEnumerator InstantiateObjects (GameObject player, IEnumerable<EnemyDataSpawn> enemyDataSpawnList){

        foreach(var enemyDataSpawn in enemyDataSpawnList){

            while( /* too many enemies of enemyDataSpawn type */ ) {
                yield return new WaitForSeconds(enemyDataSpawn.delay);
            }
            // instantiate enemyDataSpawn
        }

    }
}