IEnumerator 在使用它每 0.5 秒产生一个敌人时保持统一崩溃

IEnumerator keeps crashing unity when using it to spawn an enemy ever 0.5 seconds

我知道这通常意味着某处存在无限循环,但我已将其缩小到此 IEnumerator,因为当我删除它时,它工作正常,但会同时生成所有敌人。这个想法是它计算出该波需要多少敌人,然后每 0.5 秒生成 1 个敌人,直到达到该数量,而不是一次为该波生成所有敌人。

更新方法:

void Update()
{
    Enemies = GameObject.FindGameObjectsWithTag("EndlessKnife");
    NoOfEnemies = 0;
    foreach (GameObject Enemy in Enemies)
    {
        NoOfEnemies++;
    }
    if (NoOfEnemies == 0)
    {
        waveNumber++;
        StartingAmount = Mathf.RoundToInt(waveNumber + (Mathf.Pow(1.2f, waveNumber)));
        for (int i = 0; i < StartingAmount;)
        {
            if (Limit == false)
            {
                SpawnEnemy();
                i++;
                Limit = true;
                StartCoroutine(GradualSpawn());
            }
        }
    }
}

IEnumerator:

IEnumerator GradualSpawn()
    {
        yield return new WaitForSeconds(0.5f);
        Limit = false;
    }

我使用相同的逻辑来限制我的武器的射速,所以不明白为什么它会在这里崩溃,任何输入都是有帮助的:D

for 循环意味着您希望所有敌人都在同一帧上生成(您不这样做),因为 for 循环将在 int i 小于您的 StartingAmount 时继续执行。如果你想在一段时间内生成敌人,只需使用 if 语句而不是 for 循环:

int i = 0;
if (i < StartingAmount) {
    if (Limit == false) {
         SpawnEnemy();
         i++;
         Limit = true;
         StartCoroutine(GradualSpawn());
    }
}

现在应该可以了:)

你的问题是你被困在这里if (Limit == false)。您需要稍微重组代码,以便所有等待和循环都发生在协程中,否则您的程序将阻塞。

if (NoOfEnemies == 0){
    waveNumber++;
    StartingAmount = Mathf.RoundToInt(waveNumber + (Mathf.Pow(1.2f, waveNumber)));
    StartCoroutine(GradualSpawn(StartingAmount));
}

然后在你的协程中

IEnumerator GradualSpawn(int StartingAmount)
{
    for (int i = 0; i < StartingAmount; i++){
        SpawnEnemy();
        yield return new WaitForSeconds(0.5f);
    }
}

这应该每 0.5 秒产生一个敌人。
希望这有帮助