c# - 如何在协程中暂停生成,直到所有生成的对象都被销毁?
问题描述
我只是不知道如何写 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;
}
解决方案
使用 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);
}
推荐阅读
- abp - ABP 框架 Azure Devops 构建未找到 ABP 库
- android - 在全屏模式下收听状态栏/导航栏可见性?
- php - Mysql JOIN 与 IN 语句 (FIND_IN_SET) *已解决
- python - 使用 pandas 以所需格式读取 JSON 文件
- xmpp - 如何记录 Prosody IM 发送和接收的完整详细的 XMPP 消息
- android - 带有通用接口的 Dagger/DuplicateBindings,即使在使用限定符注释时也是如此
- python - 是 sudo 和脚本中的用户
- c# - 如何在函数中使用任何类型?
- keycloak - 从 postmon 调用 Keycloak 授权服务
- authentication - 如何在 Netbeans 12.0 中使用 Github 令牌?