yield return null退出迭代

时间:2018-12-18 10:08:48

标签: unity3d

   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

中建议这样做

4 个答案:

答案 0 :(得分:0)

那肯定是那个代码示例中的错误。按照设计,“ yield return null;”退出整个协程(以同样的方式,“ return;”退出void方法)。 尝试用`yield return new WaitForEndOfFrame();代替它。

答案 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 ();
}