我正在使用Unity3D,特别是C#,我正在尝试编写一个在1循环中实例化多个游戏对象的For循环,但是我想在下一个游戏之前稍微错开它们的实例化,比如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循环继续的原因,因为它不等待协程完成。
如果是这样的话,任何人都会有任何想法(除了将每个脚本放在播放器的每个硬点上并设置惊人的开始时间(或游戏对象实例化延迟))?
我想在一个脚本中完成所有这一切的主要原因是玩家可以拥有超过25个硬点,这样可以更轻松地在多个难度更高的船只上重复使用,并且更容易为我个人管理以后。
感谢大家提前提供的任何见解, 尼克威尔科克斯
答案 0 :(得分:3)
然而,for循环中的startcoroutine似乎并不慢 for循环
不,不。你的脚本的结果是在同一帧中实例化所有GameObject以及启动你的所有协同程序(其中一个具有持续不同时间的不同冷却时间)。
我假设StartCoroutine是一个单独运行的线程 来自Update线程,这就是For循环继续的原因, 因为它不是在等待协程完成。
没有:)。 Coroutines生活在同一个主题中。他们只是iterator blocks。 Citing 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);
}
}