在后台加载新场景

4
我正在创建一个针对三星Gear VR的Unity应用程序。我目前有两个场景:
  1. 初始场景
  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;
}

使用该代码后,场景不会发生变化。

我尝试了典型的 SceneManager.LoadScene("name"),在这种情况下,30秒后场景能够正确地更改。

1个回答

8

这应该可以工作

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

其次,我见过这样的情况,在场景没有激活时isDone从未被设置为true。请删除这些代码行:
    while(!async.isDone){
          yield return null;
    }

除此之外,你的代码还在第一个 while 循环中加了锁。添加 yield 以使应用程序能够继续加载你的代码。

因此,你的整个代码看起来像这样:

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循环中的锁定。

3
您提到的每一个可能的问题都已经涵盖了,但是在这种情况下,场景无法加载的问题只是因为async.isDone。应该删除async.isDone。您关于yield return null语句的说法是正确的,但与浮点数比较无关。 - Programmer
Unity在0.9处停止加载场景,对吗?我有点生疏了,但是由于浮点精度的原因,它实际上可能是0.899999999,这将导致无法满足where子句,你觉得呢? - Riaan Walters
2
@ParadoxForge 我明白你的意思,但这里不适用。当加载完成时,async.progress将始终返回确切的值0.9。 它在完成加载时不会返回任何其他值。 即使这样做if(async.progress == 0.9f){async.allowSceneActivation = true;}也是可以的和安全的。 您可以在这里阅读更多信息。 至于您的0.89,这可能会导致问题,因为您将激活尚未完全加载的场景。 您的其余答案很好。 - Programmer
1
谢谢@程序员的详细解释,我会编辑答案。 - Riaan Walters
2
不客气。还有一件事。这个only只有在 allowSceneActivation 被设置为 false 时才适用。在这种情况下,OP 最初将其设置为 false - Programmer
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接