Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Все Гайды Мой Кабинет

Создаём динамический прогресс загрузки сцен

Во многих крупных играх, загрузка сцен может занимать продолжительное время. И в некоторых случаях, игрок ожидающий загрузку сцены(игры) не понимает, загружается ли сцена. Игрок может принять загрузку игры за зависание, тем самым перезапустив игру заново.

Для таких случаев и создают динамический прогресс загрузки сцен, в котором игрок видит, что игра действительно загружается, и понимает, сколько ещё ему ожидать времени до окончания загрузки.

Весь этот функционал состоит из трёх сцен:

  • 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 с игрой.

Фух, наконец-то я справился. Надеюсь мне удалось объяснить данную тему, ведь это было не просто. Если остались вопросы, пишите в комментариях.

Вы можете отблагодарить автора донатом. ₽ Спасибо

Комментарии

1
Everlost 2 года назад

У меня пишет ошибку : Assets\Script\Tools\loadScene.cs(15,5): error CS0305: Using the generic type 'IEnumerator<T>' requires 1 type arguments

Гости не могут оставлять комментарии. Войдите на Сайт или Зарегистрируйтесь