[英]Unity3d - Coroutine in For Loop
我正在使用Unity3D(特别是C#)进行工作,并且试图编写一个For循环,以1个循环实例化多个游戏对象,但是我想在实例化下一个游戏对象之前将它们的实例化稍作调整,例如0.5秒。 。
我认为这就像进行普通循环一样简单:
for (int i = 0; i <= 3; i++)
{
Instantiate(gameObject, objectSpawn[i].transform.position, Quaternion.identity);
StartCoroutine(WeaponsCooldown(6));
}
StartCoroutine(WeaponsCooldown(2));
在我的couroutine中,我有一个开关盒,这样我就可以多次重复使用(想想一艘船上的多个难点之类的东西)
IEnumerator WeaponsCooldown(int coolTrigger)
{
switch (coolTrigger)
{
case 1:
mainFire = true;
yield return new WaitForSeconds(5);
mainFire = false;
break;
case 2:
leftFire = true;
yield return new WaitForSeconds(3);
leftFire = false;
break;
...down to case 6 (for this project)
因此,我得到的结果是:for循环之外的StartCoroutine可以正常发射-这是该武器的主要冷却时间,可防止玩家通过垃圾邮件发射它。 但是,for循环中的startcoroutine似乎并不会减慢for循环的速度,而且我对Unity3D脚本和C#还是很陌生,因此我不确定如何解决这个问题。
我假设StartCoroutine是一个独立于Update线程的线程,这就是For循环继续的原因,因为它不等待协程完成。
如果是这样的话,除了在玩家的每个难点上放置单个脚本并为每个游戏者设置错开的开始时间(或游戏对象实例化延迟)之外,还有人有什么想法吗?
我想要在1个脚本中全部完成游戏的主要原因是,玩家可以拥有25个以上的难点,这将使它在具有较少难点的多艘船上重用变得更容易,并且以后更便于我个人进行管理。
谢谢大家提前提供的任何见解,尼克·威尔考克斯(Nick Willcox)
但是,for循环内的startcoroutine似乎不会减慢for循环的速度
不,不是。 脚本的结果是在同一帧中实例化所有GameObject并启动所有协程(其中一个协程持续时间不同,冷却时间也不同)。
我假设StartCoroutine是一个独立于Update线程的线程,这就是For循环继续的原因,因为它不等待协程完成。
不:) 协程生活在同一个线程中。 它们只是迭代器块 。 引用乔恩·斯凯特(Jon Skeet):
在C#2中,当您使用迭代器块实现IEnumerable或IEnumerator(或通用形式)时,编译器会为您完成所有艰苦的工作。 它为您构建一个状态机,获得的迭代器有效地执行迭代器块中的代码,并随其产生值。
我认为描述它们的另一种方法是协作式多任务处理。
我试图编写一个For循环,在1个循环中实例化多个游戏对象,但是我想在实例化下一个游戏对象之前将它们的实例化稍稍交错一下,例如0.5秒。
在不考虑您要实现的特定行为的情况下,延迟实例化调用(0.5秒)的一种简单方法是将for循环包装在自己的协程中:
public IEnumerator DelayInstantiate()
{
for (int i = 0; i <= 3; i++)
{
Instantiate(gameObject, objectSpawn[i].transform.position, Quaternion.identity);
StartCoroutine(WeaponsCooldown(6)); //or do what you want
yield return new WaitForSeconds(0.5f);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.