首页 > 解决方案 > 如何在协程中暂停生成,直到所有生成的对象都被销毁?

问题描述

我只是不知道如何写 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;
}

标签: c#unity3dcoroutine

解决方案


使用 aList作为字段来跟踪火箭:

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

推荐阅读