Unity3d协程Corountine中的For循环

 

学习了协程Corountine的基本与那里后,这篇文章我们以问答式的方式来学习下Unity3d协程中的for循环的使用。

问题:

我正在用Unity3D,使用的是C#,我正在尝试着写一个For循环,在一个循环中实例化多个游戏对象,但是我想稍微交错实例化,在下一个游戏对象实例化之前,比如说0.5秒,

我认为这和做一个单循环一样简单 :


for (int i = 0; i <= 3; i++)
{
Instantiate(gameObject, objectSpawn[i].transform.position, Quaternion.identity);
StartCoroutine(WeaponsCooldown(6));
}
StartCoroutine(WeaponsCooldown(2));

在协程中,有个切换案例,所以我可以重复多次使用。


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能够很好地激发,这是武器的主冷却时间,保证player不断地朝它发射。然而,For循环之内的StartCoroutine似乎并没有减缓For循环,由于我刚接触Unity和C#,所以我不知道如何找出错在哪里。

我假设StartCoroutine是一个单独的线程,除了运行Update线程,那是For循环仍在继续的原因,因为它不会等待线程结束。

如果是这样的话,有什么解决方法呢?

我想在一个脚本内完成的原因是:player可以有25个以上的硬点,这样可以更加简单的用较少的硬点重用多个船只,对于我个人来说也会更加方便一点。

先谢过!

答案:

For循环中的startcoroutine似乎不会减缓For循环。

你的脚本得到的结果是在同一帧中实例化所有的GameObject,并开始所有的协同程序(不同的冷却持续不同的时间)。

假设除了Update 线程以外,StartCoroutine是一个单独运行的线程。这是For循环继续的原因,因为它不会等待协程来完成。

协程在所有的线程中有用。它们是迭代器块(iterator blocks)

引用一下 Jon Skeet的话:

在 C# 2, 当你使用迭代器块来执行 IEnumerable 或 IEnumerator(或通用表格)编译器会为你完成所有的复杂工作。它建立一个状态机,在迭代器块中,迭代器有效的获得执行代码,随着它的运行yield值。

另一个描述它的方法是协同式多任务(cooperative multitasking)。

我在尝试写一个For循环,在1 个循环中实例化所有的游戏对象,但是我只想稍微错开它们的实例化,比如0.5秒,在下一个游戏对象实例化之前。

不考虑实现过程中的具体行为,有个简单的方法可以延迟实例化调用(0.5秒):在协程自身中wrap 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);
}
}