协程只触发一次

本文关键字:一次 | 更新日期: 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对象列表。我怀疑(没有足够的代码来知道),你调用这个函数的方式是不正确的。

另一方面,由于yield返回一个waitforX,从长远来看,最好是在这个函数(您从哪里调用它)之外执行等待,或者至少将等待周期作为函数的参数添加。像这样的硬编码值最终会让你陷入困境,特别是当你的游戏代码基础不断增长时。我建议将其作为GameObject的设置,这样就可以在编辑器中进行调整。

还有一件事,当你使用完这些Ramp对象时,你如何销毁它们?最好考虑在创建它们时存储对它们的引用,以便以后可以销毁它们。