IENumerator не дает результатов при каждом вызове, а случайный диапазон не сбрасывается при каждом запуске - PullRequest
1 голос
/ 21 апреля 2019

Я создаю метеорный поток, который выбирает случайный пустой игровой объект из списка игровых объектов.Я хочу, чтобы один метеор создавался каждые 2.33f.Затем программа должна выбрать новую случайную зону возрождения из списка и повторять до тех пор, пока smallWaveCounter не достигнет 0. Этот код работает, но без остановок создает метеоры, пока smallWaveCounter не достигнет 0, и между экземплярами нет паузы.

Мой вопрос: почему кажется, что IENumerator дает только при первом запуске?Как я могу изменить случайный объект при каждом запуске?

[SerializeField]
private List<GameObject> meteorSpawnSmall = new List<GameObject>();
 private int smallCounter;

 private void Start()
{
    foreach(GameObject spawn in meteorSpawnSmall)//Counts objects in list
    {
        smallCounter++;
    }
 }

void Update()
{

 if (showerStart == true)
    {            
            StartCoroutine(SmallShower());

        if(smallWaveCount <= 0)
        {
            showerStart = false;
        }
    }
  }

IEnumerator SmallShower()
{
    if (smallWaveCount > 0)
    {
        yield return new WaitForSeconds(smallWaveTimer);// smallWaveTimer = 2.33f
        smallPickerNum1 = Random.Range(0, smallCounter - 1); // Needs to randomize each run
        smallPickerNum2 = Random.Range(0, smallCounter - 1);
        while (smallPickerNum2 == smallPickerNum1)
        {
            smallPickerNum2 = Random.Range(0, smallCounter - 1);
        }
        getSpawnZone1 = meteorSpawnSmall[smallPickerNum1];//Grabs the spawnzone from list
        getSpawnZone2 = meteorSpawnSmall[smallPickerNum2];//Grabs the 2nd spawn zone from list
        Instantiate(smallMeteor, getSpawnZone1.transform.position, Quaternion.identity);
        Instantiate(smallMeteor, getSpawnZone2.transform.position, Quaternion.identity);
        smallWaveCount--;//smallWaveCount starts at int 10
    }
}

1 Ответ

1 голос
/ 21 апреля 2019

Он действительно ждет каждый раз, но вы выполняете сопрограмму каждый кадр, поэтому вы не можете различить разницу.Измените свой код немного как:

void Update()
{

 if (showerStart == true) {            
        showerStart = false; //to ensure that your coroutine called once
        StartCoroutine(SmallShower());
    }
}

IEnumerator SmallShower()
{
    while (smallWaveCount > 0)
    {
        yield return new WaitForSeconds(smallWaveTimer);// smallWaveTimer = 2.33f
        smallPickerNum1 = Random.Range(0, smallCounter - 1); // Needs to randomize each run
        smallPickerNum2 = Random.Range(0, smallCounter - 1);
        while (smallPickerNum2 == smallPickerNum1)
        {
            smallPickerNum2 = Random.Range(0, smallCounter - 1);
        }
        getSpawnZone1 = meteorSpawnSmall[smallPickerNum1];//Grabs the spawnzone from list
        getSpawnZone2 = meteorSpawnSmall[smallPickerNum2];//Grabs the 2nd spawn zone from list
        Instantiate(smallMeteor, getSpawnZone1.transform.position, Quaternion.identity);
        Instantiate(smallMeteor, getSpawnZone2.transform.position, Quaternion.identity);
        smallWaveCount--;//smallWaveCount starts at int 10
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...