2017-09-01 130 views
1

我有一個方法來啓動協程,並應該停止它並重新啓動它之前重新設置一些事情。Unity StopCoroutine不工作

private Coroutine wholeTutorialRoutine; 

public void RunWholeTutorial() 
{ 
    tutorialText.text = ""; 
    StopAllCoroutines(); 

    if(wholeTutorialRoutine != null) 
    { 
     StopCoroutine(wholeTutorialRoutine); 
    } 

    wholeTutorialRoutine = StartCoroutine(WholeTutorial()); 

} 

private IEnumerator WholeTutorial() 
{ 
    // Wait until after we are done showing this dialouge 
    yield return StartCoroutine(ShowDialougForSeconds("tap_to_kill", 5f)); 

    yield return new WaitForSeconds(5f); 

    yield return StartCoroutine(ShowDialougForSeconds("larger_enemies", 5f)); 

    yield return new WaitForSeconds(5f); 

    yield return StartCoroutine(ShowDialougForSeconds("press_button", 7f)); 

    yield return new WaitForSeconds(3f); 

    yield return StartCoroutine(ShowDialougForSeconds("button_colors", 5f)); 
} 

private IEnumerator ShowDialougForSeconds(string diagID, float time) 
{ 
    SetText(diagID); 

    tutorialText.GetComponent<Animator>().SetTrigger("FadeIn"); 

    yield return new WaitForSeconds(time); 

    tutorialText.GetComponent<Animator>().SetTrigger("FadeOut"); 
} 

wholeTutorialRoutineCoroutine類型的私有字段。

我覺得有些事情發生在那些WaitForSeconds調用中,但我不確定是什麼。

RunWholeTutorial()連接到一個按鈕,所以我想停止當前的教程,並重新開始,如果用戶反覆按下它。

目前發生的情況似乎是協程運行在另一個之上。

+0

您是否嘗試將呼叫改變爲if語句下的StopAllCoroutines? – z3nth10n

+0

是的,我沒有改變任何東西 – BenjaFriend

+0

刪除'StopAllCoroutines'並看看會發生什麼。這是很好的顯示'wholeTutorialRoutine'是如何聲明的 – Programmer

回答

1

,而不是使用IEnumeratorCoroutineRunWholeTutorial協程功能一次的實例存儲在Start功能。然後,您可以使用該變量來啓動和停止它。

private IEnumerator wholeTutorialRoutine; 

void Start() 
{ 
    wholeTutorialRoutine = WholeTutorial(); 
} 

public void RunWholeTutorial() 
{ 
    tutorialText.text = ""; 

    if (wholeTutorialRoutine != null) 
    { 
     StopCoroutine(wholeTutorialRoutine); 
    } 

    StartCoroutine(wholeTutorialRoutine); 
} 

private IEnumerator WholeTutorial() 
{ 
    // Wait until after we are done showing this dialouge 
    yield return StartCoroutine(ShowDialougForSeconds("tap_to_kill", 5f)); 

    yield return new WaitForSeconds(5f); 

    yield return StartCoroutine(ShowDialougForSeconds("larger_enemies", 5f)); 

    yield return new WaitForSeconds(5f); 

    yield return StartCoroutine(ShowDialougForSeconds("press_button", 7f)); 

    yield return new WaitForSeconds(3f); 

    yield return StartCoroutine(ShowDialougForSeconds("button_colors", 5f)); 
} 

private IEnumerator ShowDialougForSeconds(string diagID, float time) 
{ 
    SetText(diagID); 

    tutorialText.GetComponent<Animator>().SetTrigger("FadeIn"); 

    yield return new WaitForSeconds(time); 

    tutorialText.GetComponent<Animator>().SetTrigger("FadeOut"); 
} 
+0

這部分工作..'RunWholeTutorial'連接到一個按鈕,每次你按下按鈕,它就跳到'WholeTutorial'例程的下一步。 例如,如果剛剛發生了「tap_to_kill」步驟,那麼您按下按鈕兩次,它將自動跳到「greater_enemies」步驟,而不是從頭開始重新開始。 – BenjaFriend

+2

@BenjaFriend在一開始就需要做另一個'wholeTutorialRoutine = WholeTutorial();'調用'StopCoroutine(wholeTutorialRoutine)'後面的''行來重置枚舉器 –

+0

@ScottChamberlain有趣。我一直在使用它,而不必重新初始化變量,並且完全沒有問題。每次協程都停止時,你必須這樣做? – Programmer