2017-11-06 1 views
0

Ich habe eine Auswahl an Tasten und ein 360-Grad-Video hängt davon ab, welche Taste Sie auswählen. Ich möchte, dass der Benutzer den Raycast für 5 Sekunden auf dem Button hat, bevor das nächste Video abgespielt wird.Coroutine wird nicht gestoppt Unity

Dies scheint in Ordnung zu sein, aber ich brauche die Coroutine zu stoppen, wenn der Strahl nicht auf der Schaltfläche ist. Ich habe versucht, die Coroutine zu stoppen, wenn der Strahl nicht auf dem richtigen Menüpunkt ist, aber es geht weiter. Dies ist, was ich bisher versucht:

public Coroutine coroutine; 

void Update() 
    { 

     //create the ray to cast forward 
     RaycastHit hit; 
     Vector3 origin = transform.position; 
     Vector3 direction = transform.forward; 
     Ray ray = new Ray(origin, direction); 
     Debug.DrawRay(origin, direction * 100, Color.blue); 

     if (Physics.Raycast(ray, out hit)) 
     { 
      objectCollided = hit.collider.gameObject.name; 
      hasHit = true; 

      if (objectCollided == "goForwardCube") 
      { 
       coroutine = StartCoroutine(WaitAndPrint()); 
      } 
else if (objectCollided != "goForwardCube") 
      { 
       StopCoroutine(coroutine); 
      } 

     } 



    IEnumerator WaitAndPrint() 
    { 

      // suspend execution for 5 seconds 
      ButtonControl.forwardCube.GetComponent<MeshRenderer>().material.color = Color.clear; 
      forwardText.text = "5"; 
      yield return new WaitForSeconds(1); 
      ButtonControl.forwardCube.GetComponent<MeshRenderer>().material.color = Color.blue; 
      forwardText.text = "4"; 
      yield return new WaitForSeconds(1); 
      ButtonControl.forwardCube.GetComponent<MeshRenderer>().material.color = Color.clear; 
      forwardText.text = "3"; 
      yield return new WaitForSeconds(1); 
      ButtonControl.forwardCube.GetComponent<MeshRenderer>().material.color = Color.blue; 
      forwardText.text = "2"; 
      yield return new WaitForSeconds(1); 
      ButtonControl.forwardCube.GetComponent<MeshRenderer>().material.color = Color.clear; 
      forwardText.text = "1"; 
      yield return new WaitForSeconds(1); 
      videoPlayer.url = "Assets/Videos/1(360).mp4"; 
      ButtonControl.DisableButtons(); 
      videoPlayer.Play(); 


    } 

Auch dies seit der Umsetzung scheint es eine lange Pause vor den nächsten Videospielen zu sein und es scheint ziemlich laggy. Gibt es eine Möglichkeit, dies zu verbessern?

Antwort

1

Da Sie Ihre Coroutine in der Update-Funktion aufrufen, rufen Sie möglicherweise jeden Frame auf, den Ihr Raycast auf der Schaltfläche hat. Die Sache ist, dass StopCoroutine nur die erste Coroutine mit dem gegebenen Namen stoppt. Also laufen alle anderen, die du angefangen hast, weiter.

Um dies zu beheben, fügen Sie zusätzlich zum Raycast einen Boolean ein, um zu überprüfen, ob Ihre Coroutine bereits gestartet wurde.

public Coroutine coroutine; 
bool alreadyStarted = false; 

void Update() 
{ 

    //create the ray to cast forward 
    RaycastHit hit; 
    Vector3 origin = transform.position; 
    Vector3 direction = transform.forward; 
    Ray ray = new Ray(origin, direction); 
    Debug.DrawRay(origin, direction * 100, Color.blue); 

    if (Physics.Raycast(ray, out hit)) 
    { 
     objectCollided = hit.collider.gameObject.name; 
     hasHit = true; 

     if (objectCollided == "goForwardCube" && !alreadyStarted) 
     { 
      alreadyStarted = true; 
      coroutine = StartCoroutine(WaitAndPrint()); 
     } 
     else if (objectCollided != "goForwardCube") 
     { 
      alreadyStarted = false; 
      StopCoroutine(coroutine); 
     } 
    } 
    else 
    { 
     alreadyStarted = false; 
    } 
} 


IEnumerator WaitAndPrint() 
{ 

     // suspend execution for 5 seconds 
     ButtonControl.forwardCube.GetComponent<MeshRenderer>().material.color = Color.clear; 
     forwardText.text = "5"; 
     yield return new WaitForSeconds(1); 
     ButtonControl.forwardCube.GetComponent<MeshRenderer>().material.color = Color.blue; 
     forwardText.text = "4"; 
     yield return new WaitForSeconds(1); 
     ButtonControl.forwardCube.GetComponent<MeshRenderer>().material.color = Color.clear; 
     forwardText.text = "3"; 
     yield return new WaitForSeconds(1); 
     ButtonControl.forwardCube.GetComponent<MeshRenderer>().material.color = Color.blue; 
     forwardText.text = "2"; 
     yield return new WaitForSeconds(1); 
     ButtonControl.forwardCube.GetComponent<MeshRenderer>().material.color = Color.clear; 
     forwardText.text = "1"; 
     yield return new WaitForSeconds(1); 
     videoPlayer.url = "Assets/Videos/1(360).mp4"; 
     ButtonControl.DisableButtons(); 
     videoPlayer.Play(); 

     alreadyStarted = false; 

} 
+0

HINWEIS: Sie könnten auch "bereitsStarted = false;" in einer 'else' Aussage des "if (Physics.Raycast (ray, out hit))" –

Verwandte Themen