IEnumerator loadScene(string sceneName)
{
AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);
while (!operation.isDone)
{
Debug.Log(operation.progress);
yield return null;
}
}
我正在使用以上代码加载场景。它完美地加载了场景,但是operation.progress仅运行一次。它只会打印一个值0.05的东西。
如果我使用下面的代码,它甚至都不会加载场景。
IEnumerator loadScene(string sceneName)
{
AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);
operation.allowSceneActivation = false;
while (!operation.isDone)
{
Debug.Log(operation.progress);'
if (asyncOperation.progress >= 0.9f)
{
asyncOperation.allowSceneActivation = true;
}
yield return null;
}
}
甚至在统一文档https://docs.unity3d.com/ScriptReference/AsyncOperation-allowSceneActivation.html
中建议这样做答案 0 :(得分:0)
答案 1 :(得分:0)
1)。我敢打赌,操作是出于其他原因。添加
Debug.Log( $"is operation done:{ operation.isDone }, progress:{ operation.progress }" );
就在循环测试之后
2)。调试协程是否被外部因素阻止(例如对象破坏)
void OnEnable ()
{
Debug.Log( $"{ name } enabled" , gameObject );
}
void OnDisable()
{
Debug.Log( $"{ name } disabled" , gameObject );
}
void OnDestroy ()
{
Debug.Log( $"{ name } destroyed" );
}
答案 2 :(得分:0)
好吧,问题是加载场景的速度太快了,如果您想对其进行更多控制,则进度会立即达到0.9,您可以尝试以下操作:
float time = 0;
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("Rotation");
asyncLoad.allowSceneActivation = false;
while (!asyncLoad.isDone)
{
time += Time.deltaTime;
Debug.Log(asyncLoad.progress+" time is"+time);
if (time > 4.0f)
asyncLoad.allowSceneActivation = true;
yield return null;
}
它将在4秒钟后加载场景,如果您希望此协程在加载新场景后继续工作,请在DontDestroyOnLoad(this.gameObject)
中添加Start()
看到评论中的混乱之处后,我也想添加此解释。 yield return null
不会破坏或返回协程。它只在执行一次while之后返回,然后协程将从下一帧中的剩余位置继续。此示例中的问题是他的场景在1帧中加载,因此协程结束得很快。通常,使用yield return null
在每一帧中进行1次迭代。希望这对您有帮助!
答案 3 :(得分:0)
尝试减产。
int count = 0;
StartCoroutine(CountCoroutine ());
IENumerator CountCoroutine () {
count++;
if (count > 10) {
yield break;
}
yield return new WaitForEndOfFrame ();
}