yield return null выходит из итерации - PullRequest
0 голосов
/ 18 декабря 2018
   IEnumerator loadScene(string sceneName)
{
    AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);
    while (!operation.isDone)
    {
        Debug.Log(operation.progress);
        yield return null;
    }


}

Я использую приведенный выше код для загрузки сцены.Он отлично загружает сцену, но операция. Прогресс выполняется только один раз.Он просто печатает одно значение 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 голосов
/ 15 мая 2019

Попробуйте перерыв на урожай.

int count = 0; 

StartCoroutine(CountCoroutine ());

IENumerator CountCoroutine () { 

    count++;

    if (count > 10) { 
         yield break; 
    } 

    yield return new WaitForEndOfFrame ();
}
0 голосов
/ 18 декабря 2018

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" );
}
0 голосов
/ 18 декабря 2018

Хорошо, проблема в том, что загрузка сцены происходит слишком быстро, и прогресс сразу достигает 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 итерацию в каждом кадре.Надеюсь, это поможет удаче!

0 голосов
/ 18 декабря 2018
Это определенно будет ошибкой в ​​этом примере кода.По замыслу `yield return null;` выходит из всей сопрограммы (так же, как 'return;' выходит из метода void).Попробуйте заменить его на `yield return new WaitForEndOfFrame ();`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...