这是问题所在的代码:
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还少),我想游戏继续产卵剩余的敌人产卵。
提前谢谢你
发布于 2017-03-23 13:45:45
你可以使用一个单独的敌人-产卵协同线,而不是发射每一个你想要产卵的敌人的协同线。通过这种方式,你可以很容易地控制何时产卵,何时推迟产卵:
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
}
}
}
https://stackoverflow.com/questions/42977591
复制相似问题