Найти в Дзене
alkihuri

Переключение сцен в Unity с помощью Finite State Machine

Данный материал специально создан, чтобы компесировать флуд созданный мной в чате Дагестанских разработчиков DevSeagulls. Простите ребята, я не специально.
Для того, чтобы понять как работать со сценами нужно понять что же такое сцена в Untiy. Сцена в Unity это файл, который содедежит описание каждого объекта на сцене (рис. 2) , его положение, масштаб, и прочие свойства. Фактически файл сцены содержит ссылки на префабы объектов со всеми сойствами в виде текствого файла (аним. 1): Unity может загружать несколько сцен одновремено, переходить между сценами с помощью C# и библиотеки SceneManagement. Я в данной технологии не сеньйор-помидор но исходя из нескольких проектов, которые довелось пилить - нашел достаточно простую и безопастную реализацию. Для начала давайте разберем примеры мамкиных-ютуберов: Допусти мы имеем 2 сцены: Нужно : перейти из сцены A в сцену B. Шаг номер 1 - добавим сцены в настройки сборки (рис 4.): Затем в сцене A - запускаем скрипт с данной командой. Есл

Данный материал специально создан, чтобы компесировать флуд созданный мной в чате Дагестанских разработчиков DevSeagulls. Простите ребята, я не специально.

Для того, чтобы понять как работать со сценами нужно понять что же такое сцена в Untiy.

рис. 1 Сцены в Unity
рис. 1 Сцены в Unity

Сцена в Unity это файл, который содедежит описание каждого объекта на сцене (рис. 2) , его положение, масштаб, и прочие свойства.

рис. 2 Окно Scene  со списком объектов в окне Hierarchy (в центре)
рис. 2 Окно Scene со списком объектов в окне Hierarchy (в центре)

Фактически файл сцены содержит ссылки на префабы объектов со всеми сойствами в виде текствого файла (аним. 1):

аним. 1 Содержимое Unity сцены
аним. 1 Содержимое Unity сцены

Unity может загружать несколько сцен одновремено, переходить между сценами с помощью C# и библиотеки SceneManagement.

Я в данной технологии не сеньйор-помидор но исходя из нескольких проектов, которые довелось пилить - нашел достаточно простую и безопастную реализацию.

Для начала давайте разберем примеры мамкиных-ютуберов:

Допусти мы имеем 2 сцены:

  • A
  • B

Нужно : перейти из сцены A в сцену B.

Шаг номер 1 - добавим сцены в настройки сборки (рис 4.):

рис.  4 Настрйоки сборки. File -> Build Settings
рис. 4 Настрйоки сборки. File -> Build Settings

Затем в сцене A - запускаем скрипт с данной командой.

рис. 5  Загрузка уровня B, с закрытием A
рис. 5 Загрузка уровня B, с закрытием A
рис 6. Загрузка сцены без закрытия предыдщуей
рис 6. Загрузка сцены без закрытия предыдщуей
рис. 7  Ассинхронная загрузка, подойдет для прогузки больших уровней
рис. 7 Ассинхронная загрузка, подойдет для прогузки больших уровней

Если у вас в проекте 2 сцены, то такой метод - ок.
Но даже в простом кликере - 3 сцены. Следовательно в каждой сцене нужно пробрасывать логику для переключения на другую сцену.

рис. 8  Количесвто условных переходов для сцен при описаном выше методе
рис. 8 Количесвто условных переходов для сцен при описаном выше методе

Каждая стрелочка - это переход на сцену.
Казалось бы - 3 сцены = 6 переходов, значит 4 сцены = 8 переходов... а вот и нет.

Комбинаторика говорит нам, что сложность тут будет вычислятся так: (n^2) - n, где n - количесвто ваших кринжовых сцен.

Но, ктото может возразить:

"Ну и что? Напишем какой-нибудь синглтон и будем вызывать метод в каждой сцене. У-у-у-у-у-у!"

На самом деле, тут дело не только в количестве вызовов функции, а скорее в том, что это не безопастно.

Чем больше элементов системы - тем она уязвимее.

Плюс ко всему у нас логика для перехода на сцену будет завязана на опредленной сцене, которая случайно может быть выгружена, и что потом делать в такой ситуации?

Что предлагаю я?

рис. 9 Ultra giga chad scene loader
рис. 9 Ultra giga chad scene loader

В моем примере всем заправляет Boot scene, который получает через PlayerPrefs текущее состояние, значит сложность тут определяется формулой 2n.

Кошерно.

рис. 10 константы с именами сцен в проекте
рис. 10 константы с именами сцен в проекте

Как мы видим тут минимальное количесвто сцен, т.к. проект находится в стадии разработки MVP (!) версии продукта.

рис. 11
рис. 11
  1. Функция для установки текущего состояния (рис. 9 верхняя стрелочка)
  2. Установка состояния выигрыша
  3. Установка состония проигрыша
  4. Немного задержки перед загрузкой - мой личный каприз
рис. 12 пример установки состоний зависящих от очков в игре
рис. 12 пример установки состоний зависящих от очков в игре

Теперь давайте посмотрим как это выглядит на примере обычной игры, где персонажу нужно отгадать буквы и догнать антогонитста Аждаху:

аним 2. Работа Boot Scene manager
аним 2. Работа Boot Scene manager

Спасибо за внимание!