Проблемы с асинхронной загрузкой уровня Unity
Решил сделать окно перехода между уровнями. Нашел в инете кучу примеров, почитал документацию, но столкнулся с непонятной проблемой.
При отображении прогресса загрузки в текстовом элементе сначала показывается "0%", потом сцена зависает на некоторое время, после чего выдает "100%" и сразу переходит на новый уровень.
Как я понимаю, загрузка выполняется, но почему она зависает вместо того, чтобы отображать в тексте проценты?
Вписывал в код Debug.Log(), через которой выводил число загрузки, но там та же картина. К примеру, "0" "0" потом 5 секунд ожидания и сразу "100" "100" "100".
На видео из примеров все работает как надо, код один и тот же. Просто скопировал в новый проект ничего не изменяя.
Вот код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class SceneLoading : MonoBehaviour
{
[Header("Загружаемая сцена")]
public int sceneID;
[Header("Остальные объекты")]
public Image LoadingImg;
public Text progressText;
void Start ()
{
StartCoroutine (AsyncLoad());
}
IEnumerator AsyncLoad()
{
AsyncOperation operation = SceneManager.LoadSceneAsync (sceneID);
while (!operation.isDone)
{
float progress = operation.progress / 0.9f;
LoadingImg.fillAmount = progress;
progressText.text = string.Format("{0:0}%", progress * 100);
yield return null;
}
}
}
Ответы (1 шт):
Откатился на версию 2019.3.15f, но думаю, что и на других пойдет. Изменил код на следующий
public int sceneID;
public Text m_Text;
void Start()
{
StartCoroutine(LoadScene());
}
IEnumerator LoadScene()
{
yield return null;
AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneID);
asyncOperation.allowSceneActivation = false;
while (!asyncOperation.isDone)
{
m_Text.text = "Loading progress: " + (asyncOperation.progress * 100) + "%";
if (asyncOperation.progress >= 0.9f)
{
asyncOperation.allowSceneActivation = true;
}
yield return null;
}
}
Теперь при загрузке все работает верно. Сначала первая сцена, потом начинает подгружаться вторая. Нужно было добавить yield return null;в начало, чтобы первая сцена успела отобразиться/прогрузиться (как я понял)
Решение нашел здесь. Куда смотрел.. :/
AsyncOperation.allowSceneActivation