2017-08-23 1 views
1

So habe ich eine Leinwand, die nicht zerstört wird, weil es hält und Schieberegler, der eine Fortschrittsleiste zeigt. Es hat auch eine Schaltfläche, die wechselbar ist, wenn der Ladevorgang 0,9 ist. Das Problem, das ich habe, ist, wenn ich auf die Schaltfläche klicke (siehe activateNewScene()). Grundsätzlich passiert, wenn ich auf den Button klicke ist, dass ich meine Szene lade und mein Canvas deaktiviere. Aber das Problem ist, dass, nachdem ich meine Leinwand deaktiviert habe, die alte Szene noch etwa 0,5 Sekunden lang angezeigt wird und dann die neue Szene geladen wird. Ich möchte, dass nach dem Deaktivieren der Leinwand die neue Szene angezeigt wird. ohne die alte Szene für kurze Zeit zu sehen.Alte Szene erscheint immer noch für kurze Zeit beim Umschalten der Szene

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.UI; 

public class SceneLoaderGameObject : MonoBehaviour { 

private SceneLoader sl; 
public Canvas cav; 

void Start() { 
    sl = new SceneLoader(); 
    cav.GetComponent<Canvas>().enabled = false; 
    DontDestroyOnLoad (this.gameObject); 
    DontDestroyOnLoad (cav.transform.parent); 
} 

public void setNewNameAndLoadScene(string name){ 

    if (cav != null) { 
     Slider slid = cav.transform.GetChild (1).GetComponent<Slider>(); 
     Text tx = cav.transform.GetChild (2).GetComponent<Text>(); 
     Button bttn = cav.transform.GetChild (3).GetComponent<Button>(); 

     sl.setNewScene (name); 
     sl.setSliderAndTextToChange (slid, tx); 
     bttn.onClick.AddListener (() => activateNewScene()); 
     cav.GetComponent<Canvas>().enabled = true; 
     cav.GetComponent<Canvas>().sortingOrder = 1; 

     StartCoroutine (sl.LoadAsynchron (name, bttn)); 

    } 

} 

public void activateNewScene(){ 
    sl.AsgetOP().allowSceneActivation=true; 
    cav.GetComponent<Canvas>().sortingOrder = 1; 
    cav.GetComponent<Canvas>().enabled = false; 
} 

} 

EDIT: Hier ist der Code, der die Szene lädt:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.SceneManagement; 
using UnityEngine.UI; 
public class SceneLoader { 

AsyncOperation operation; 
string sceneName; 
private Text txx =null; 
private Slider slider=null; 

public SceneLoader(){ 

} 

public void setSliderAndTextToChange(Slider sl, Text tx){ 
    txx = tx; 
    slider = sl; 
} 

public void setNewScene(string sceneName){ 

    if (sceneName.Length == 0) { 
     throw new UnityException ("Please enter a name"); 
    } 

    this.sceneName = sceneName; 

} 


public IEnumerator LoadAsynchron(string myMain, Button bttn){ 

    operation = SceneManager.LoadSceneAsync (myMain); 
    operation.allowSceneActivation = false; 
    while (operation.isDone == false) { 
     float progress = Mathf.Clamp01 (operation.progress/0.9f); 
     slider.value = progress; 
     txx.text = progress * 100f + " %"; 
     if (progress * 100f == 100f) { 
      bttn.interactable = true; 
     } 
     yield return null; 
    } 
} 

public AsyncOperation AsgetOP(){ 
    return operation; 
} 

} 
+1

Ich denke, Sie sollten den Code veröffentlichen, der die Szene lädt. – Programmer

+0

@Programmer hoffe, es hilft – DYRtLAWWWOTS

Antwort

0

Ich sehe. Ich denke es ist wegen der Leinwand. Versuchen Sie, den Code zu platzieren, in dem Sie die Zeichenfläche deaktivieren, und legen Sie in der Funktion OnLevelWasLoaded die Reihenfolge auf 0 fest. Also im Grunde das:

void OnLevelWasLoaded(){ 
    cav.GetComponent<Canvas>().sortingOrder = 0; 
    cav.GetComponent<Canvas>().enabled = false; 
} 
public void activateNewScene(string name){ 
    sl.AsgetOP().allowSceneActivation = true; 

    Scene sc = SceneManager.GetSceneByName(name); 
    if (sc.IsValid()) { 
      SceneManager.SetActiveScene(sc); 

    } 

} 

Ich habe den Namen der Szene hinzugefügt, um die Funktion zu aktivieren.

0

Wenn SceneManager zum ersten Mal veröffentlicht wurde, ist bekannt, dass isDone nur wahr sein wird, wenn zwei Bedingungen erfüllt sind:

.Wenn die Szene wird geladen getan

.Wenn Szene aktiviert ist

Ich weiß nicht, ob das immer noch wahr ist, aber ich werde davon ausgehen, dass es ist.

Wenn Sie auf false setzen, wird die Bedingung 2 nicht erfüllt und es treten Probleme auf. Es sieht so aus, als würde while (operation.isDone == false) immer noch ausgeführt werden, was dazu führt, dass bttn.interactable = true; auch jeden Frame ausführt, während Sie versuchen, eine neue Szene zu laden. Das ist meine Vermutung.

Ersetzen Sie while (operation.isDone == false) durch while (operation.progress < 0.9f), dann fügen Sie bttn.interactable = true; am Ende dieser Funktion nur im Fall.

public IEnumerator LoadAsynchron(string myMain, Button bttn) 
{ 
    operation = SceneManager.LoadSceneAsync(myMain); 
    operation.allowSceneActivation = false; 
    while (operation.progress < 0.9f) 
    { 
     float progress = Mathf.Clamp01(operation.progress/0.9f); 
     slider.value = progress; 
     txx.text = progress * 100f + " %"; 
     if (progress * 100f == 100f) 
     { 
      bttn.interactable = true; 
     } 
     yield return null; 
    } 
    if (!bttn.interactable) 
     bttn.interactable = true; 
} 

Wenn das nicht funktioniert, ich schlage vor, Sie SceneManager.SetActiveScene Funktion verwenden. Siehe die enableScene Funktion von this Post. Ich habe auch Fehler mit diesem gesehen, Sie können für einen Fehlerbericht vom Editor ablegen, wenn das immer noch ein Problem ist.

+0

Nein, leider hat das mein Problem nicht gelöst:/ – DYRtLAWWWOTS

+0

Was ist deine Unity-Version? – Programmer

+0

meine Version ist 5.6.1 – DYRtLAWWWOTS

Verwandte Themen