2015-12-30 27 views
5

Ich habe ein Problem mit Szenenausblendung. Ich machte eine Animation von Fade in & heraus auch ein Skript namens Fader, die eine Coroutine-Funktion hat. Animation funktioniert gut. Es gibt auch ein leeres Spielobjekt namens SceneManager mit einem Skript. In diesem Skript werden Tastenfunktionen beschrieben, die eine Szene öffnen. enter image description hereButton funktioniert nicht korrekt bei Szenenausblendung

enter image description here

Aber das Problem ist, wenn ich eine beliebige Taste klicken, zum Beispiel Scene2 Button verblassen dann in der Animation starten, an einem gewissen milliseconds wenn schwarzer Bildschirm erscheinen, wenn ich auf dieser schwarzen Bildschirm klicken Sie dann auf eine andere Szene ist offen . Es wird nicht geöffnet scene2 Dieses Video sehen

https://drive.google.com/file/d/0B1H5fdK2PJAnbm5fWDhlN3dVVnc

Paket Link https://drive.google.com/file/d/0B1H5fdK2PJAnZ2Y1UEFRMmVFbTA

Szene-Manager Skript:

public class Manager : MonoBehaviour 
{ 

    public void GoBackScene1() 
    { 
     Fader.instance.Perform ("Scene1"); 

    } 

    public void Scene2() 
    { 
     Fader.instance.Perform ("Scene2"); 
    } 

    public void Scene3() 
    { 

     Fader.instance.Perform ("Scene3"); 
    } 

    public void Scene4() 
    { 
     Fader.instance.Perform ("Scene4"); 

    } 


} 

Szene Fader Script:

public class Fader : MonoBehaviour { 

    public static Fader instance; 

    [SerializeField] 
    private GameObject canvas; 

    [SerializeField] 
    private Animator anim; 


    void Awake(){ 

     makeSingleton(); 
    } 


    public void Perform(string levelname) 
    { 
     StartCoroutine(FadeInAnimation(levelname)); 


    } 

    void makeSingleton(){ 

     if (instance != null) { 

      Destroy (gameObject); 
     } else { 
      instance = this; 
      DontDestroyOnLoad(gameObject); 

     } 



    } 

    IEnumerator FadeInAnimation(string level){ 

     canvas.SetActive (true); 

     anim.Play ("FadeIn"); 

     yield return new WaitForSeconds (1f); 

     Application.LoadLevel (level); 

     anim.Play ("FadeOut"); 

     yield return new WaitForSeconds (2f); 

     canvas.SetActive (false); 


    } 

} 

Antwort

1

Hier ist die Sache:

Fade in Animationslänge ist 0,417 Sekunden. Zwischen dem Start der Animation und LoadLevel warten Sie 1 Sekunde. Das bedeutet, dass der Bildschirm 0,583 Sekunden lang schwarz bleibt.

Das Problem ist, dass während dieser Zeit alle anderen Schaltflächen anklickbar sind. Wenn Sie also auf "Szene 2" klicken und dann auf den schwarzen Bildschirm klicken, können Sie versehentlich auf die Schaltfläche "Szene 3" klicken, wodurch FadeInAnimation("Scene3") ausgelöst wird. Da Sie Fader nicht-zerstörbare Singleton gemacht haben, wird der Ladevorgang nicht stoppen FadeInAnimation("Scene3") Ausführung.

Was Sie brauchen, ist eine Verriegelung, um zu verhindern, dass andere Tasten gedrückt werden, während der Bildschirm schwarz ist. Zum Beispiel wird etwas tun, wie dies den Job:

private bool fading = false; 

IEnumerator FadeInAnimation(string level){ 

    if (fading) yield break; 
    fading = true; 

    canvas.SetActive (true); 

    anim.Play ("FadeIn"); 

    yield return new WaitForSeconds (1f); 

    Application.LoadLevel (level); 

    anim.Play ("FadeOut"); 

    yield return new WaitForSeconds (2f); 

    canvas.SetActive (false); 

    fading = false; 

} 
+0

können Sie mich vorschlagen, wie die Sekunden sind Schreib in 'Ausbeute return new WaitForSeconds (1f)' für Ein- und Ausblendung –

+0

Es gibt keine richtige oder falsche Anzahl von Sekunden , du entscheidest. Wenn Sie einen hartcodierten Wert verwenden, ist dies die falsche Wahl. Die Wartezeit sollte auf Ihrer Animationslänge basieren. – Everts

+0

Wie gesagt, hier gibt es kein Richtig oder Falsch, man kann es 1 Sekunde lassen, es ist Ok, aber versuchen Sie nicht, den Punkt des Problems zu übersehen: Das Problem tritt nicht wegen der Länge der Animation auf, sondern weil Sie t Deaktivieren Sie Ihre Schaltflächen während der Animation. –

Verwandte Themen