更改运行时生成的延迟 [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 中指定的延迟后实例化每个敌人,则此代码有效(我没有编写"实例化敌人"部分(我使用对象池来实现这一点),位于 IEnumerator 中的产量之后,因为它对我的问题并不重要)。 问题是我为每种敌人都有一个整数(称为maxOnScreen),如果同名的活动敌人的数量等于maxOnScreen,那么我想停下来实例化所有其他敌人,直到一个敌人(活动数量等于maxOnScreen)将被停用或摧毁。如果一个敌人不再被激活,并且同名的活跃敌人数量不再等于maxOnScreen,那么我想再次实例化列表中的下一个敌人,就像我的实际代码已经做的那样。我不知道如何使用IEnumerator实现这一点,所以我的问题是:是否可以使用IEnumerator实现这一点,或者我应该使用其他方法?

简单的例子:有7个敌人活跃,3个被命名为"坏士兵",4个被命名为"好士兵"。好士兵的maxOnScreen变量是"4",所以我不希望其他敌人会实例化,除非"好士兵"中的一个将被摧毁/停用。如果活跃的"好士兵"总数是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
}
}
}

最新更新