2016-12-06 70 views
0

我正試圖讓角色將瓷磚逐個移動到某個位置。會發生什麼事是點擊位置,然後代碼找到該位置的路徑,並一次移動一個拼貼,直到到達該位置。我有尋路代碼工作,它在一個ArrayList(不要判斷)。然後我插入數組列表變成一個循環,如下所示:暫停循環以允許協程/循環完成圖形問題

//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()在協程中),但它似乎沒有工作....任何幫助將不勝感激。

回答

0

這兩種方法都在同一個線程上運行。這意味着,整個循環將被處理,繪圖將在完成後發生。然而,當循環結束時,該位置將是路徑上的最後一個。

爲了防止發生這種情況,您必須刪除循環並將變量移到方法外部,並且每次更新週期發生時移動字符一步。移動到位置方法可能看起來有點像這樣。只要s小於Path.Count,就必須在每次更新時調用它。這個想法是,你必須「循序漸進」地完成循環,而不是一次只進行一次循環。

​​
+0

我試圖做這種方式。簡而言之,我在更新函數中添加了一些代碼,這決定了它是否應該移動到下一個位置......但現在它不生成動畫,並且它現在從每個方塊傳送到下一個方塊。有任何想法嗎? –

+0

功能!不是一個錯誤:) – jdmdevdotnet

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); 
    } 

} 
+0

這是如何等待它完成?你只需等待1秒鐘。 – jdmdevdotnet

+0

如果您查看函數'MoveToPositionBuffer()'中的while循環,則到下一個tile的時間總是需要一秒鐘的時間(稍後可以通過設置'counter <「來更改)」無論時間幀「計數器「的數量相同,所以通過延遲下一個協程1秒,它給第一個協程足夠的時間來動畫移動一個瓦片:) –

1

什麼,我需要做的是暫停循環,讓第一協程完成 循環繼續,並開始所述第二協程(等等和 等)

的之前你離開是不正確的。如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])); 
    } 
}