2015-11-27 38 views
1

我有一個基於網格的遊戲,其中我編寫了我的移動腳本來逐個移動我的遊戲對象。爲了實現我想要的單元格移動,我必須使用協程。在當前協程的內部啓動新協程是否安全?

這裏是我的代碼僞代碼片段:

private Coroutine currentCoroutine; 

public void Move(Vector3 velocity) 
{ 
    currentCoroutine = StartCoroutine(MoveCoroutine(velocity)); 
} 

private IEnumerator MoveCoroutine(Vector3 velocity) 
{ 

    Vector3 endPoint; 
    Vector3 nextVelocity; 

    if(velocity == Vector3.Right) 
    { 
     endPoint = rightEndPoint; 
     // object should move left in the next coroutine 
     nextVelocity = Vector3.Left; 
    } 
    else 
    { 
     endPoint = leftEndPoint; 
     // object should move right in the next coroutine 
     nextVelocity = Vector3.Right; 
    } 

    while(currentPos != endPoint) 
    { 
     currentPos += velocity 

     yield return new WaitForSeconds(movementDelay); 
    } 

    currentCoroutine = StartCoroutine(MoveCoroutine(nextVelocity)); 

} 

基本上,這樣做是向左移動我的對象和權利。如果它已經到達了左邊緣,我就把它放到右邊,反之亦然。我從另一個腳本調用Move()

此代碼適用於我。但是,我不確定在協程裏面啓動一個新的協程是否安全,就像我在這裏所做的那樣。編寫這樣的協程時會有什麼後果嗎?我仍然習慣於協程的概念。

感謝

回答

1

開始在協程的最後一個新的協同程序是安全的。順便說一下,我注意到你的yield語句只在while循環中被調用。如果有任何機會,while循環將不會運行至少一次,則會出錯;所有的協程都必須執行一個yield語句。

+0

感謝您的理解。至於我在while循環中的yield語句,我需要內部的yield來實現逐個單元格的移動。我確信while循環不會失敗,至少運行一次。但是有沒有一種方法可以將收益率放在循環之外並仍然實現我想要的運動? – aresz

+0

您可以有多個yield語句。用你現有的代碼,你可以把'yield return null'放在它總是被調用的地方。 – user3071284

+0

啊,我現在明白了。感謝幫助! – aresz