2017-08-23 5 views
1

これは保持しているために破棄されないキャンバスを持ち、スライダーはプログレスバーを表示します。また、ロードの進行状況が0.9のときに対話できるボタンがあります。問題は、ボタンをクリックしたときです(activateNewScene()を参照)。基本的には、ボタンをクリックするとシーンがロードされ、キャンバスが無効になります。しかし問題は、キャンバスを無効にした後、古いシーンが約0.5秒間表示され、新しいシーンがロードされることです。私が望むのは、キャンバスが無効になった後、新しいシーンが表示されるはずです。古いシーンを短期間見ることなく。シーンを切り替えると、古いシーンが短時間表示されます。

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

} 

編集:ここでシーンをロードするコードは次のとおりです。SceneManagerが最初にリリースされたとき

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

シーンをロードしているコードを投稿するべきだと思います。 – Programmer

+0

@Programmer助けて欲しい – DYRtLAWWWOTS

答えて

0

です。私はそのキャンバスのためだと思う。キャンバスを無効にして、関数内で0を指すようにコードを配置してください。OnLevelWasLoadedしたがって、基本的には

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

    } 

} 

私はそれを有効にするために関数にシーン名を追加しました。

0

isDoneだけ2つの条件が満たされた場合に真であることが知られている:

シーンがロード行われ.When

シーンがアクティブになったとき

これはまだ当てはまるかどうかわかりませんが、私はそれを前提とします。

allowSceneActivationfalseに設定すると、条件2が満たされず、問題が発生します。 while (operation.isDone == false)はまだ実行されており、新しいシーンを読み込もうとしている間にすべてのフレームが実行されているようです(bttn.interactable = true;)。これは私の推測です。

while (operation.progress < 0.9f)に置き換え、その機能の最後に「bttn.interactable = true;」を追加します。

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

問題が解決しない場合、私はあなたがSceneManager.SetActiveScene機能を使用することをお勧め。投稿はthisenableScene機能を参照してください。私もこのバグを見たことがあります。これがまだ問題であれば、エディタからバグレポートを提出したいかもしれません。

+0

それは私の問題を解決しませんでしたが、残念ながら/ – DYRtLAWWWOTS

+0

あなたのUnityバージョンは何ですか? – Programmer

+0

私のバージョンは5.6.1 – DYRtLAWWWOTS

関連する問題