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

在运行时更改延迟生成[C#],c#,unity3d,delay,spawn,C#,Unity3d,Delay,Spawn,这是问题所在的代码: 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

这是问题所在的代码:

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中指定的延迟之后实例化每个敌人(我没有编写“实例化敌人”部分(我使用对象池来实现这一点),它位于IEnumerator中的屈服之后,因为这对我的问题并不重要),那么这段代码就可以工作。 问题是,对于每种敌人,我都有一个整数(称为maxOnScreen),如果同名的活动敌人的数量等于maxOnScreen,那么我想停止实例化其他所有敌人,直到一个敌人(活动数量等于maxOnScreen)被停用或摧毁。如果一个敌人不再被激活,并且同名的活跃敌人的数量不再等于maxOnScreen,那么我想再次实例化列表中的下一个敌人,他的延迟与我的实际代码一样。我不知道如何使用IEnumerator实现这一点,所以我的问题是:是否可以使用IEnumerator实现这一点,或者我应该使用其他一些方法

简单的例子:有7个活跃的敌人,3个叫“坏士兵”,4个叫“好士兵”。good soldier的最大屏幕变量是“4”,所以我不希望其他敌人实例化,除非“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
        }

    }
}
公共类EnemySpawnScript:MonoBehavior{
公共无效敌人棋子(游戏对象玩家,等级数据等级){
start例程(实例化对象(player,level.enemyDataSpawner));
}
IEnumerator实例化对象(游戏对象播放器,IEnumerable enemyDataSpawnList){
foreach(enemyDataSpawnList中的变量enemyDataSpawn){
而(/*enemyDataSpawn类型的敌人太多了*/){
返回新的WaitForSeconds(enemyDataSpawn.delay);
}
//实例化enemyDataSpawn
}
}
}

只需在等待后做某事之前添加
if(activeNumber
(我相信您正在实例化敌人),在现有实现中添加检查将使其跳过某些敌人的繁殖,而不是延迟其繁殖。谢谢您的回答,我喜欢你的解决方案,但也许你误解了这个问题:每个敌人都有延迟,每个敌人都必须产生延迟(我的代码已经做到了,但我最喜欢你的代码)。我的问题是,如果同名的敌人太多,我想完全阻止其他敌人的繁殖,当其中一个被摧毁时,我想让游戏再次使用“返回新的WaitForSeconds(enemyDataSpawn.delay);”在enemyDataSpawnList中继续繁殖其他敌人。让我知道,如果你不明白,我会尽量解释得更好!恐怕我真的不明白这个问题。我的脚本获取要繁殖的敌人列表,并且(a)以设定的繁殖间隔逐个繁殖它们。如果(b)在任何一点上无法繁殖(例如屏幕上的敌人数量太多),它将(c)在本次迭代中不会繁殖任何东西,但将(d)等待另一个繁殖间隔,并且(e)在此之后再次尝试繁殖敌人,如果(f)无法再次繁殖,它将(g)等待更多。。。以此类推,直到(h)所有敌人成功繁殖。你能解释一下哪一步不适合你的任务吗?好的,我编辑了你的答案,因为它几乎是正确的。它需要在while语句之前实例化对象的开头有这两行:previousEnemyDelay+=enemyDataSpawn.delay;返回新的WaitForSeconds(PreviousEneyDelay);谢谢你,我让你的答案是最好的!