
Во многих крупных играх, загрузка сцен может занимать продолжительное время. И в некоторых случаях, игрок ожидающий загрузку сцены(игры) не понимает, загружается ли сцена. Игрок может принять загрузку игры за зависание, тем самым перезапустив игру заново.
Для таких случаев и создают динамический прогресс загрузки сцен, в котором игрок видит, что игра действительно загружается, и понимает, сколько ещё ему ожидать времени до окончания загрузки.
Весь этот функционал состоит из трёх сцен:
- Menu - главная сцена с кнопкой "Начать игру".
- LoadScene - промежуточная сцена с элементом прогресса загрузки.
- Game - сцена нашей игры.

Логика следующая. Игрок нажимает кнопку "Начать игру", и его перебрасывает со сцены Menu в LoadScene. Далее, в LoadScene запускается корутина, которая подгружает данные из сцены Game, а процент загрузки отображается в графическом виде. Как только корутина загрузит сцену Game на 100%, произойдёт открытие сцены Game.
А теперь перейдём к самому главному - реализации.
Сцена Menu
Создадим кнопку "Начать Игру". А так же следующий скрипт для данной кнопки:
using UnityEngine;
using UnityEngine.SceneManagement;
public class startGame : MonoBehaviour
{
public void openLoadScene()
{
SceneManager.LoadScene("LoadScene");
}
}
Как Вы могли догадаться, этот скрипт открывает сцену LoadScene. Так же не забудьте в Inspector-e указать для кнопки, событие onClick: openLoadScene. Теперь перейдём к самомму главному.
Сцена LoadScene
Первым делом подготовим наш прогресс загрузки. Для этого создадим игровой объект Canvas, в котором будут находится наши элементы. Канвас можете настроить как Вам удобно.
Теперь создадим фоновое изображение для нашего прогресса загрузки. Для этого создаём графический объект: UI - Image. Называем его, например, Background. В окне Inspector производим настройки следующим образом:
- В поле Suorce Image загружаем фоновое изображение для нашего прогресса. У меня это полностью чёрная картинка, с таким же названием, Background.
- В поле Image Type выбираем Filed.
- В поле Fill Method выбираем Horizontal.
- В поле Fill Origin выбираем Left.
- В поле Preserve Aspect ставим галочку, чтобы изображение имело пропорции оригинала.

Теперь создадим ещё один графический объект: UI - Image. Называем его, например, Progress. Дальше проделываем всё тоже самое, за исключением поля Source Image, в которую мы должны перетащить изображение нашего прогресса загрузки, которое называется так же, Progress. У меня данное изображение имеет полностью зелёную заливку.
Важно: Убедитесь, что в Иерархии объектов, объект Progress находится под объектом Background. А на игровой сцене оба эти объекта находились в одной позиции, то-есть одно изображение на другом.
Для того, чтобы убедиться, что всё сделано верно, Выберите объект Progress, и в Инспекторе, в поле Fill Amount поэкспериментируйте с его значением. Результат Ваших манипуляций должен отображаться в игровой сцене:

Если всё работает, значит Вы всё сделали правильно. Именно поле Fill Amount мы будем программно изменять, в зависимости от загрузки нашей сцены. Ну а теперь, перейдём к нашим любимым скриптам.
Создадим C# скрипт, с названием loadScene, со следующим содержимым:
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class loadScene : MonoBehaviour
{
public Image slider;
void Start()
{
StartCoroutine(LoadSceneGame());
}
IEnumerator LoadSceneGame()
{
AsyncOperation LoadAsync = SceneManager.LoadSceneAsync("Game");
while (!LoadAsync.isDone)
{
float progress = LoadAsync.progress;
slider.fillAmount = progress;
yield return null;
}
}
}
В строке #3 мы добавили библиотеку, так как работаем с UI элементами(картинкой-прогрессом). В строке #7 мы объявили переменную slider, в которой будем хранить ссылку на наше изображение(Progress). Она нам нужна для того, чтобы в дальнейшем менять его свойство Fill Amount.
В строке #11 мы запускаем корутину. которая в строке #15 занимается подгрузкой нашей игры(сцена Game). А начиная со строки #13, мы проверяем процент загрузки нашей сцены, и заносим эти данные в Fill Amount. Как только загрузка будет полностью завершена, запустится наша сцена Game с игрой.
Фух, наконец-то я справился. Надеюсь мне удалось объяснить данную тему, ведь это было не просто. Если остались вопросы, пишите в комментариях.
У меня пишет ошибку : Assets\Script\Tools\loadScene.cs(15,5): error CS0305: Using the generic type 'IEnumerator<T>' requires 1 type arguments