暂停循环以允许Coroutine / Loop完成图形问题

时间:2016-12-06 17:04:23

标签: c# unity3d coroutine

我试图将角色一个接一个地移动到一个位置。发生的是点击该位置,然后代码找到该位置的路径并一次移动一个图块直到它到达该位置。我有路径查找代码工作,它在ArrayList中(不要判断)。然后我将数组列表插入到for循环中,如下所示:

//This function Moves Character to clicked location
void MoveToPosition(ArrayList Path)
{

    int s = 2;
    while (s < Path.Count)
    {
        Debug.Log(Path[s]);
        StartCoroutine(MoveToPositionBuffer((Vector3) Path[s]));
        s++;

    }
    ResetTiles();
}

//This does the continous Calculations Somehow
IEnumerator MoveToPositionBuffer(Vector3 Position)
{
    Vector3 StartingPosition = gameObject.transform.position;
    Vector3 EndPosition = Position;
    EndPosition[1] = StartingPosition[1];

    float counter = 0;

    while(counter < 1)
    {
        counter += Time.deltaTime;
        gameObject.transform.position = Vector3.Lerp(StartingPosition, EndPosition, counter);
        yield return null;
    }
}

现在我的主要问题是它经过整个循环,然后从起始位置到结束位置进行Lerping并跳过图形,从第一个瓷砖移动到第二个瓷砖,再到第三个瓷砖等等。需要做的是暂停循环让第一个Coroutine在循环继续之前完成并启动第二个Coroutine(依此类推)。我尝试了一些我在谷歌(Thread.Sleep()Yield Return WaitForSeconds()在Coroutine中找到的东西,但它似乎没有用......任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:1)

  

我需要做的是暂停循环以让第一个Coroutine完成   循环之前继续并启动第二个Coroutine(依此类推   等等)

您离开的answer不正确。就像AlGoreRhythm所述,你只等待1秒钟。它现在可能适合您,但可靠。当帧速率大幅下降时,您的代码无法完成运行。

删除WaitForSeconds,然后使用yield return StartCoroutine(MoveToPositionBuffer((Vector3)Path[i]));

IEnumerator DelayForMovingLoop(ArrayList Path)
{
    for (int i = 2; i < Path.Count; i++)
    {
        yield return StartCoroutine(MoveToPositionBuffer((Vector3)Path[i]));
    }
}

答案 1 :(得分:0)

这两个方法都在同一个线程上运行。这意味着,整个循环将被处理,绘图将在完成后进行。当循环结束时,这意味着该位置将是路径上的最后一个。

为了防止这种情况,你必须删除循环并将变量移到方法之外,每次更新周期发生时,jsut都会将字符移动一步。转向位置方法可能看起来有点像这样。只要s小于Path.Count,就必须在每次更新时调用它。这个想法是,你必须“分步”进行循环,而不是一次完成一次。

private int s = 2;

void MoveToPosition(ArrayList Path)
{
   Debug.Log(Path[s]);
   StartCoroutine(MoveToPositionBuffer((Vector3) Path[s]));
   s++;
}

答案 2 :(得分:0)

我所要做的只是将IEnumerator函数放在IEnumerator函数中,这样我可以设置延迟:

 IEnumerator DelayForMovingLoop(ArrayList Path)
{

    for (int i = 2; i < Path.Count; i++)
    {
        StartCoroutine(MoveToPositionBuffer((Vector3)Path[i]));
        yield return new WaitForSeconds(1);
    }

}