c# - 如何暂停协程中的生成,直到所有生成的对象都被销毁?

标签 c# unity-game-engine coroutine

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

最佳答案

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

关于c# - 如何暂停协程中的生成,直到所有生成的对象都被销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56262382/

相关文章:

c# - 如何生成均匀分布的游戏对象并沿圆形路径移动它们?

android - 数据库更新协程完成后,设置 bool 标志

c# - ASP.NET MVC 6 基于 HTTP 状态码处理错误

c# - Sql Server 以编程方式从远程客户端还原/备份数据库

c# - 无法加载文件或程序集 log4net

facebook - 每次我登录游戏时,Unity Facebook SDK 都会不断要求我确认登录

linux - 是否可以将 Kinect 连接到 Unity3D 并编译使其在 Jetson TK1 上运行?

python - 将带有回调的函数变成 Python 生成器?

c# - OutputCache Location=客户端似乎没有工作

ios - 在运行时将对象导入Unity3d/iOS VR程序