2015-12-30 10 views
5

Mam do czynienia z problemem z zanikiem sceny. Zrobiłem animację zanikania w & out również wykonał skrypt o nazwie Fader, który ma funkcję coroutine. Animacja działa dobrze. Istnieje również pusty obiekt gry o nazwie SceneManager, który ma skrypt. W tym skrypcie zapisywane są funkcje przycisków, które otwierają scenę. enter image description herePrzycisk nie działa poprawnie w przypadku zaniku sceny

enter image description here

Ale problem jest po kliknięciu dowolnego przycisku, na przykład Scene2 Button potem zanikać na początku animacji, w pewnym milliseconds kiedy pojawiają się czarny ekran, jeśli kliknięciu na tym czarnym ekranie następnie kolejna scena jest otwarta . To nie otworzy scene2 obejrzeć ten film

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

Link pakiet skrypt Menedżer https://drive.google.com/file/d/0B1H5fdK2PJAnZ2Y1UEFRMmVFbTA

Scena:

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

    } 


} 

Scena Fader Scenariusz:

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


    } 

} 

Odpowiedz

1

Tutaj jest rzecz:

Zanikanie w długości animacji wynosi 0,417 sekundy. Pomiędzy rozpoczęciem animacji a LoadLevel musisz poczekać 1 sekundę. Oznacza to, że ekran pozostaje czarny przez 0,583 sekundy.

Problem polega na tym, że przez cały ten czas wszystkie inne przyciski są klikalne. Jeśli klikniesz "Scena 2", a następnie klikniesz czarny ekran, możesz przypadkowo nacisnąć przycisk "Scena 3", co zainicjuje FadeInAnimation("Scene3"). Ponieważ wykonałeś Fader niezniszczalny singleton, poziom obciążenia nie zatrzyma wykonania FadeInAnimation("Scene3").

Potrzebne jest pewne blokowanie, aby uniemożliwić klikanie innych przycisków, gdy ekran jest czarny. Na przykład coś takiego zrobi pracy:

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

może mi zasugerować co sekunda są zapisem w 'plon powrócić nowe WaitForSeconds (1f)' dla fade in i out –

+0

Nie ma dobrych lub złych ilość sekund Ty decydujesz. Faktycznie użycie nieprawidłowo zakodowanej wartości jest złym wyborem, czas oczekiwania powinien być oparty na długości animacji. – Everts

+0

Jak powiedział Fafase, nie ma tu dobrego ani złego, możesz zostawić go na 1 sekundę, jest OK, ale staraj się nie pomijać punktu problemu: problem nie występuje z powodu długości animacji, ponieważ nie robisz tego t wyłącz przyciski podczas animacji. –