如何暂停协程中的生成,直到所有生成的对象都被破坏?

时间:2019-05-22 17:49:44

标签: c# unity3d coroutine

我只是不知道如何编写if部分。剩下的只是实例化位置和四元数之类的东西……可能。

我想知道GameObject rocketspawnblue和GameObject rocketspawnred是否消失了,所以我可以生成下一对,直到生成循环中的所有对。

这是我在 Scanner userInput = new Scanner(System.in); int [][] matrix = new int[2][2]; for (int x = 0 ; x < 2 ; x++){ for(int y = 0 ; y < 2 ; y++){ System.out.printf("enter a number for row %d column %d : ",(x+1),(y+1)); matrix[x][y] = userInput.nextInt(); } } for(int t : matrix){ System.out.print(t + " "); } userInput.close(); } 中放入的产卵协程。但是那可能行不通,因为在我拿走所有火箭之前都需要检查每一帧。...

Start()

1 个答案:

答案 0 :(得分:2)

使用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);
}