Не могу остановить сопрограмму в Unity - PullRequest
1 голос
/ 31 марта 2019

Я пытаюсь остановить волны, появляющиеся после смерти игрока, но я не могу остановить сопрограмму. Я действительно не знаю, как атаковать это больше, потому что добавление операторов if и break не сработало. Как мне вызвать StopCoroutine и сделать остановку? Нужно ли вводить новые методы и тому подобное?

void Start () {
    gameOver = false;
    StartCoroutine (SpawnWaves());
}

void Update()
{
    if (gameOver)
    {
        StopCoroutine(SpawnWaves());
    }
  }

IEnumerator SpawnWaves()
{
    yield return new WaitForSeconds(startWait);
    while (true)
    {
        for (int i = 0; i < hazardCount; i++)
        {
            GameObject enemy = enemies[Random.Range(0, enemies.Length)];
            Instantiate(enemy, spawnPosition1, spawnRotation1);
            Instantiate(enemy, spawnPosition2, spawnRotation2);
            Instantiate(enemy, spawnPosition3, spawnRotation3);
            Instantiate(enemy, spawnPosition4, spawnRotation4);
            Instantiate(enemy, spawnPosition5, spawnRotation5);
            Instantiate(enemy, spawnPosition6, spawnRotation6);
            yield return new WaitForSeconds(spawnWait);
        }
        yield return new WaitForSeconds(waveWait);
        enemies[0].GetComponent<EnemyBehviour>().currentHealth *= enemyHealthMultiplier;
    }
}

Ответы [ 4 ]

3 голосов
/ 31 марта 2019
  1. Вам нужно установить для gameOver значение True, когда игрок умрет
  2. Вам также нужно добавить логику, чтобы изменить цикл while на false, чтобы выйти из цикла while.

Например, установите gameOver = true когда currentHealth == 0 внутри цикла while и установите while(gameOver == false)

2 голосов
/ 31 марта 2019

Полное исправление благодаря руководству @ AlexG

void Start () {
    gameOver = false;
    StartCoroutine (SpawnWaves());
}

IEnumerator SpawnWaves()
{
    yield return new WaitForSeconds(startWait);
    while (gameOver != true)
    {
        for (int i = 0; i < hazardCount; i++)
        {
            if(gameOver)break;
            GameObject enemy = enemies[Random.Range(0, enemies.Length)];
            Instantiate(enemy, spawnPosition1, spawnRotation1);
            Instantiate(enemy, spawnPosition2, spawnRotation2);
            Instantiate(enemy, spawnPosition3, spawnRotation3);
            Instantiate(enemy, spawnPosition4, spawnRotation4);
            Instantiate(enemy, spawnPosition5, spawnRotation5);
            Instantiate(enemy, spawnPosition6, spawnRotation6);
            yield return new WaitForSeconds(spawnWait);
        }
        yield return new WaitForSeconds(waveWait);
        enemies[0].GetComponent<EnemyBehviour>().currentHealth *= eenter code herenemyHealthMultiplier;
    }
}
2 голосов
/ 31 марта 2019

Я думаю, что проблема может заключаться в том, что когда вы вызываете StopCoroutine (), вы не указываете ему остановить ваш конкретный экземпляр сопрограммы. Вместо этого вам нужно сохранить ссылку на вашу сопрограмму и передать ее в качестве параметра вашему Stop.

IEnumerator wavecoroutine = SpawnWaves();
StartCoroutine(wavecoroutine);

...

StopCoroutine(wavecoroutine);
1 голос
/ 31 марта 2019

RyeMoss на самом деле имеет правильный ответ.Вам не нужно, чтобы изменить условие вашего времени цикла, но вместо этого нужно убедиться, что вы передаете значение ссылки на StopCoroutine метод.В документах вы можете видеть, что это именно то, что они делают.

Проблема в том, что при вызове SpawnWaves возвращается новый IEnumerator, что, очевидно, не то, что вы хотитекогда вы пытаетесь остановить это, хаха.

Просто измените в своем методе Start на

gameOver = false;
waves = SpawnWaves(); <-- or whatever you want to call it
StartCoroutine(waves); <-- using a reference

и затем передайте waves в StopCoroutine.

Всегда внимательно читайте документы;они ваши лучшие друзья при изучении новых библиотек, фреймворков и т. д. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...