Coroutine只发射一次

时间:2016-09-11 10:45:30

标签: c# unity3d unity5

我正在尝试运行一个脚本,在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);
    }
}

2 个答案:

答案 0 :(得分:1)

我怀疑你的病情i <= lP.Count只有一次。 (也许lP.Count == 1,我认为)。

协同工作的方式是,CreateRamp函数内的代码跨多个帧执行。

当你StartCoroutine(CreateRamp(...))时,它立即运行直到它达到yield语句。它将在那里等待0.2秒,并将在收益后立即从声明中再次运行。

在第二次执行中,它再次评估条件i <= lP.Count并看到它是False =&gt;它跳出循环并且因为它碰到了函数的末尾,那个协同例程将被停止,将来不再执行。

答案 1 :(得分:-1)

由于此函数是IEnumerable,因此应将其他代码视为Ramp对象列表。我怀疑(没有足够的代码可以知道),你调用这个函数的方式是不正确的。

另一方面,当你的收益率返回一个waitforX时,从长期来看,要么在这个函数之外执行等待(你从哪里调用它),或者至少将等待时间添加为函数的参数。像这样的硬编码值最终会让你咬人,特别是如果游戏的代码库增长。我建议将它作为GameObject的一个设置公开,因此可以从编辑器中调整它。

另外一件事,当你完成它们时,你如何破坏这些Ramp对象?在创建它们时考虑存储对它们的引用可能是好的,这样你以后就可以销毁它们。