2016-09-11 51 views
0

我试图运行一个脚本,它会在点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); 
    } 
} 
+0

那么,lP.Count的返回是什么? –

+0

与你的问题没有关系,但你应该在每个循环调用'.GetComponent ()'并将结果保存在局部变量中,然后让5个调用使用该变量。 –

+0

您是否使用StartCoroutine运行此方法?如果您将其作为常规方法调用:CreateRamp(...),它将只执行一次。 –

回答

1

我怀疑你的条件i <= lP.Count是真实的只有一次。 (也许lP.Count == 1,我认为)。

协同例程的工作方式是CreateRamp函数中的代码在多个帧中执行。

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

在第二次执行中,它再次评估条件i <= lP.Count并且看到它是False =>它跳出循环,并且因为它到达函数的末尾,该协程将被停止,不再执行在将来。

+0

问题是我正在使用Debug.Log行来测试lP.Count是否小于2,并且我得到(应该是)广泛的结果(通常在1到24之间):代码总是运行一旦。 –

+0

lP.Count在循环内部变化,不是吗?你的意思是你正在运行超过1个操作相同列表的共同程序,不是吗?如果是这样的话,你能否发布其他协同例程的代码? –

+0

哦,也许你已经知道,列表是一个参考类型。这意味着对其内容所做的任何更改(添加,删除,更新元素)也会反映在您的CreateRamp(..)中。 –

-1

由于此功能是一个IEnumerable它应该由其他代码为Ramp对象的列表进行处理。我怀疑(没有足够的代码可以知道),你调用这个函数的方式不正确。

在附注中,当您的yield返回waitforX时,从长远来看,要么执行该函数以外的等待(您从中调用它)或者至少添加等待期作为函数的参数。像这样的硬编码值最终会让你咬牙切齿,特别是如果你的游戏的代码库增长的话。我建议将它作为GameObject的设置公开,因此可以从编辑器调整它。

另一件事情,当你完成它们后,你如何销毁这些Ramp对象?在创建它们时考虑存储对它们的引用可能会很好,以便稍后可以销毁它们。

+0

感谢您的回复,至于您的旁注,我会将等待时间放在函数参数中,我将使用GameObject池而不是实例化并销毁所有内容......这仅仅是为了测试。 –

+0

至于我如何调用它,我只是在触摸函数中使用StartCoroutine方法,并使用vector3的列表和所需的角度作为参数来执行此操作。 –

+0

查看该代码会很有用,因为这很可能出现问题。 – meganaut