2017-09-01 2 views
1

Ich habe eine Methode, um eine Coroutine zu starten, und sollte sie anhalten und einige Dinge zurücksetzen, bevor ich sie erneut starte.Unity StopCoroutine funktioniert nicht

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

wholeTutorialRoutine ist ein privates Feld vom Typ Coroutine.

Ich habe das Gefühl, dass etwas funky passiert mit diesen WaitForSeconds Anrufe, aber ich bin mir nicht ganz sicher was.

RunWholeTutorial() ist an eine Schaltfläche angeschlossen, also möchte ich das aktuelle Tutorial anhalten und neu starten, wenn der Benutzer es immer und immer wieder drückt.

Momentan scheint es so zu sein, dass die Coroutinen übereinander laufen.

+0

Haben Sie versucht, den Aufruf von StopAllCoroutines unter der Anweisung if zu ändern? – z3nth10n

+0

Ja ich habe, das ändert nichts – BenjaFriend

+0

Entfernen Sie die 'StopAllCoroutines' und sehen, was passiert. Es wäre gut zu zeigen, wie 'wholeTutorialRoutine' deklariert wird – Programmer

Antwort

1

Verwenden IEnumerator statt Coroutine speichern die Instanz der RunWholeTutorial Koroutine Funktion einmal in der Start Funktion. Sie können dann mit der Variablen IEnumerator starten und stoppen.

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

Dies funktioniert teilweise .. 'RunWholeTutorial' ist an eine Taste angeschlossen, und jedes Mal, wenn Sie die Taste drücken, springt es einfach zum nächsten Schritt in der 'WholeTutorial'-Routine. Zum Beispiel, wenn der "tap_to_kill" Schritt gerade passiert ist, dann drücken Sie die Taste zweimal, es wird automatisch zum Schritt "grand_enemies" springen, anstatt von vorne zu beginnen. – BenjaFriend

+2

@BenjaFriend, um am Anfang neu zu beginnen, müssen Sie eine andere 'wholeTutorialRoutine = WholeTutorial();' Aufruf nach der 'StopCoroutine (wholeTutorialRoutine);' Zeile, um den Enumerator zurückgesetzt –

+0

@ScottChamberlain Interessant. Ich habe es so benutzt, ohne die Variable neu initialisieren zu müssen und überhaupt keine Probleme. Sie müssen das jedes Mal tun, wenn die Coroutine gestoppt wird? – Programmer

Verwandte Themen