2016-10-13 10 views
3

私は、Samsung Gear VRを対象としたUnityアプリケーションを作成しています。データの大きな量(それはシーンをロードするには時間がかかりすぎる)と、バックグラウンドで新しいシーンを読み込む

  1. 初期シーン
  2. 2番目のシーン:私は現在、2つのシーンがあります。

最初のシーンから、バックグラウンドで2番目のシーンを読み込み、読み込まれた後に切り替えます。新しいシーンがバックグラウンドでロードされている間、ユーザーはVR環境の一部を見るために頭を動かすことができます。

私はSceneManager.LoadSceneAsyncを使用していますが、それは働いていない:

// ... 

StartCoroutiune(loadScene()); 

// ... 

IEnumerator loadScene(){ 
     AsyncOperation async = SceneManager.LoadAsyncScene("Scene", LoadSceneMode.Single); 
     async.allowSceneActivation = false; 
     while(async.progress < 0.9f){ 
       progressText.text = async.progress+""; 
     } 
     while(!async.isDone){ 
       yield return null; 
     } 
     async.allowSceneActivation = true; 
} 

そのコードを使用すると、シーンが変わることはありません。

これを試しましたが、この場合は30秒後にシーンが正しく変更されます。SceneManager.LoadScene("name")

答えて

5

これは

while(async.progress < 0.9f){ 
      progressText.text = async.progress.ToString(); 
      yield return null; 
    } 

を動作するはずです第二に、私はシーンが起動していない限りisDoneは、trueに設定されることはありません例を見てきました。

while(!async.isDone){ 
      yield return null; 
    } 

さらに、最初のwhileループでコードをロックしています。アプリケーションがコードをロードし続けるように歩留まりを追加します。

だからあなたの全体のコードは次のようになります。

IEnumerator loadScene(){ 
    AsyncOperation async = SceneManager.LoadAsyncScene("Scene", LoadSceneMode.Single); 
    async.allowSceneActivation = false; 
    while(async.progress <= 0.89f){ 
      progressText.text = async.progress.ToString(); 
      yield return null; 
    } 
    async.allowSceneActivation = true; 
} 

あなたの問題の最大の犯人は、しかし、最初のwhileループでロックです。

+2

考えられるすべての問題をカバーしましたが、この場合、シーンが読み込まれないという問題は単純にasync.isDoneのためです。 'async.isDone'を削除する必要があります。あなたは 'yield return null'ステートメントについては正しいですが、これは浮動小数点の比較とは関係ありません。 – Programmer

+0

Unityは0.9でシーンのロードを停止しますか?私はこれでは少し錆びていますが、浮動小数点精度のため実際には0.899999999になる可能性がありません。実際にはwhere句を決して満たさないでしょうか? –

+0

@ ParadoxForgeはいですが、通常は浮動小数点にある程度のエラー修正があります。私は数が非常に低く(例えば0.1)、それがまったくトリガーされることを確認することによってデバッグします。 – Qix

関連する問題