IEnumerator продолжает разрушать единицу, когда использует его для появления врага каждые 0,5 секунды. - PullRequest
2 голосов
/ 30 апреля 2020

Я понимаю, что это обычно означает, что где-то существует бесконечный l oop, однако я сузил его до этого IEnumerator, поскольку, когда я его удаляю, он работает нормально, но порождает всех врагов одновременно. Идея состоит в том, что он определяет, сколько врагов требуется для этой волны, а затем порождает 1 врага за 0,5 секунды на единицу достигнутого количества, а не порождает всех врагов для волны сразу.

Метод обновления:

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;
    }

Я использую эту же логику c для ограничения скорострельности своего оружия, поэтому не понимаю, почему оно падает здесь, любой ввод полезен: D

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

A для l oop будет означать, что вы хотите, чтобы все ваши враги появлялись в одном кадре (чего вы не делаете), потому что a для l oop будет выполняться, пока int i меньше, чем ваша StartingAmount , Если вы хотите порождать врагов в течение определенного периода времени, просто используйте оператор if вместо a для l oop:

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

Это должно сработать сейчас:)

1 голос
/ 30 апреля 2020

Ваша проблема в том, что вы застряли здесь 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;){
        SpawnEnemy();
        yield return new WaitForSeconds(0.5f);
    }
}

Это должно порождать одного врага каждые 0,5 секунды
Надеюсь, это поможет

...