协程只触发一次
本文关键字:一次 | 更新日期: 2023-09-27 18:06:35
我试图运行一个脚本,将在点a和b之间的触摸产生一个"坡道"。这段代码接收一个坡道元素应该在哪里的列表,然后实例化并将它们放在屏幕上。
然而协程只运行一次,我不明白为什么。谁能给我一些建议?
提前谢谢你
public IEnumerator CreateRamp(List<Vector3> lP, float angle)
{
int i = 1;
while (i <= lP.Count)
{
Debug.Log("Iteration " + i + " of " + lP.Count + " position is " + lP[i]);
GameObject item = Instantiate(Resources.Load("floor")) as GameObject;
item.transform.position = current_Position;
item.transform.eulerAngles = new Vector3(0, 0, UnityEngine.Random.Range(0f, 360f));
item.GetComponent<Ramp>().strtPos = item.transform.position;
item.GetComponent<Ramp>().strtRot = item.transform.eulerAngles;
item.GetComponent<Ramp>().strtScale = new Vector3(0.4f, 0.4f, 1);
item.GetComponent<Ramp>().tgtRot = new Vector3(0, 0, angle);
item.GetComponent<Ramp>().tgtPos = lP[i-1];
i += 1;
yield return new WaitForSeconds(0.2f);
}
}
我怀疑你的条件i <= lP.Count
只有一次是真的。(也许是lP.Count == 1
,我想)。
协例程的工作方式是,CreateRamp
函数内的代码跨多个帧执行。
当您执行StartCoroutine(CreateRamp(...))
时,它将立即运行,直到遇到yield语句。它将在那里等待0.2秒,并将在yield之后从语句中再次运行。
在第二次执行时,它再次计算条件i <= lP.Count
,并看到它是False
=>它跳出循环,因为它到达了函数的末尾,该联合例程将被停止,以后不再执行
由于该函数是IEnumerable,因此其他代码应该将其视为Ramp
对象列表。我怀疑(没有足够的代码来知道),你调用这个函数的方式是不正确的。
还有一件事,当你使用完这些Ramp对象时,你如何销毁它们?最好考虑在创建它们时存储对它们的引用,以便以后可以销毁它们。