我试图将角色一个接一个地移动到一个位置。发生的是点击该位置,然后代码找到该位置的路径并一次移动一个图块直到它到达该位置。我有路径查找代码工作,它在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中找到的东西,但它似乎没有用......任何帮助都会非常感激。
答案 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);
}
}