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