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