Как я могу приостановить нерест в сопрограмме, пока все объекты не будут уничтожены? - PullRequest
2 голосов
/ 22 мая 2019

Я просто не знаю, как написать часть if.Остальное - просто создание экземпляра позиции и кватерниона .... Вероятно.

Я хочу знать, если GameObject rocketspawnblue и GameObject rocketspawnred пропали, поэтому я могу порождать следующую пару, пока все пары в цикле не будутпорожденный.

Это моя нерестовая сопрограмма, которую я вставил Start().однако это, вероятно, не сработает, потому что нужно проверять каждый кадр, пока я не заберу все свои ракеты ....

for (int i = 1; i < 6; i++)
{
    yield return new WaitForSeconds(1);
    GameObject rocketspawnblue = Instantiate(
            rocketblue, 
            new Vector3(Random.Range(-15, 15), (Random.Range(-15, 15))), 
            Quaternion.identity);
    SpriteRenderer rocketscolor1 = rocketspawnblue.GetComponent<SpriteRenderer>();
    //rocketscolor.color = colors[Random.Range(0,colors.Length)];
    rocketscolor1.color = Color.blue;

    GameObject rocketspawnred = Instantiate(
            rocketred, 
            new Vector3(Random.Range(-15, 15), (Random.Range(-15, 15))), 
            Quaternion.identity);
    SpriteRenderer rocketscolor2 = rocketspawnred.GetComponent<SpriteRenderer>();
    //rocketscolor.color = colors[Random.Range(0, colors.Length)];
    rocketscolor2.color = Color.red;
}

1 Ответ

2 голосов
/ 22 мая 2019

Используйте List в качестве поля для отслеживания ракет:

private List<GameObject> rockets;

В начале Start() создайте экземпляр списка:

rockets = new List<GameObject>();

В вашей сопрограмме очистите список с помощью Clear, затем используйте Add, чтобы добавить ракеты в ваш список. После того, как вы закончите добавление, используйте WaitWhile для цикла, пока не останется ракет. Мы напишем метод с именем AnyRocketsLeft, который возвращает true, если есть еще те, которые еще не уничтожены.

После WaitWhile используйте WaitForSeconds, чтобы подождать секунду, чтобы определить время между партиями.

for (int i = 1; i < 6; i++)
{
    rockets.Clear();
    GameObject rocketspawnblue = Instantiate(
            rocketblue, 
            new Vector3(Random.Range(-15, 15), (Random.Range(-15, 15))), 
            Quaternion.identity);
    SpriteRenderer rocketscolor1 = rocketspawnblue.GetComponent<SpriteRenderer>();
    //rocketscolor.color = colors[Random.Range(0,colors.Length)];
    rocketscolor1.color = Color.blue;
    rockets.Add(rocketspawnblue);

    GameObject rocketspawnred = Instantiate(
            rocketred, 
            new Vector3(Random.Range(-15, 15), (Random.Range(-15, 15))), 
            Quaternion.identity);
    SpriteRenderer rocketscolor2 = rocketspawnred.GetComponent<SpriteRenderer>();
    //rocketscolor.color = colors[Random.Range(0, colors.Length)];
    rocketscolor2.color = Color.red;
    rockets.Add(rocketspawnred);

    yield return new WaitWhile(() => AnyRocketsLeft());
    yield return new WaitForSeconds(1);
}

// ran out of rockets
// set up the "next level" prompt, etc. here

Чтобы проверить, не уничтожены ли еще какие-либо ракеты, мы можем проверить их свойство activeInHierarchy. Просто переберите список ракет и верните true, если вы найдете, и false в противном случае.

private bool AnyRocketsLeft() {
    foreach (int i = 0 ; i < rockets.count ; i++) {
        if (rockets[i].activeInHierarchy) return true;
    }
    return false;
}

Если вы используете Linq, вы можете использовать List.Any ():

private bool AnyRocketsLeft() {
    return rockets.Any(o => o.activeInHierarchy);
}
...