Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在后台加载新场景_C#_Unity3d_Unity5 - Fatal编程技术网

C# 在后台加载新场景

C# 在后台加载新场景,c#,unity3d,unity5,C#,Unity3d,Unity5,我正在创建一个针对三星Gear VR的Unity应用程序。我现在有两个场景: 最初的场景 第二个场景,数据量大(加载场景花费的时间太长) 从第一个场景开始,我想在后台加载第二个场景,并在加载后切换到它。当新场景在后台加载时,用户应保持头部移动的能力,以查看虚拟现实环境的任何部分 我正在使用SceneManager.LoadSceneAsync,但它不起作用: // ... StartCoroutiune(loadScene()); // ... IEnumerator loadScene(

我正在创建一个针对三星Gear VR的Unity应用程序。我现在有两个场景:

  • 最初的场景
  • 第二个场景,数据量大(加载场景花费的时间太长)
  • 从第一个场景开始,我想在后台加载第二个场景,并在加载后切换到它。当新场景在后台加载时,用户应保持头部移动的能力,以查看虚拟现实环境的任何部分

    我正在使用
    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;
    }
    
    /。。。
    StartRoutiune(loadScene());
    // ...
    IEnumerator加载场景(){
    AsyncOperation async=SceneManager.LoadAsyncScene(“场景”,LoadSceneMode.Single);
    async.allowSceneActivation=false;
    而(异步进程<0.9f){
    progressText.text=async.progress+“”;
    }
    而(!async.isDone){
    收益返回空;
    }
    async.allowSceneActivation=true;
    }
    
    有了这些代码,场景永远不会改变

    我在典型的
    SceneManager.LoadScene(“name”)
    中尝试过这种方法,在这种情况下,场景在30秒后会正确更改。

    应该可以

        while(async.progress < 0.9f){
              progressText.text = async.progress.ToString();
              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;
    }
    
    IEnumerator加载场景(){
    AsyncOperation async=SceneManager.LoadAsyncScene(“场景”,LoadSceneMode.Single);
    async.allowSceneActivation=false;
    
    虽然(async.progress您涵盖了所有可能的问题,但在本例中,场景未加载的问题只是因为
    async.isDone
    async.isDone
    应该被删除。关于
    yield return null
    语句,您是对的,但这与浮点比较无关。Unity停止加载场景e为0.9,对吗?我对此有点生疏,但由于浮点精度,它不可能实际为0.8999999,这实际上永远不会满足where子句的要求吗?@ParadoxForge我理解您的意思,但这不适用于这里。
    async.progress
    将始终返回
    0.9的精确值加载完成后。加载完成后,它不会返回任何其他值。如果(async.progress==0.9f){async.allowSceneActivation=true;}
    您可以阅读更多关于此的内容。对于您的
    0.89
    ,这可能会导致问题,因为您将激活尚未100%加载的场景。您的其余答案很好。感谢@Programmer的详细介绍,我将编辑答案。欢迎您。还有一件事。这适用于
    allowSceneActivation
    is设置为
    false
    。在这种情况下,它在开始时由OP设置为
    false
    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;
    }