Привет Никлас из Something We Made!

В этом посте я хочу подробно рассказать, как мы делаем наш удобный MenuManager для TOEM. Этот менеджер значительно улучшил наш рабочий процесс, а также устранил время на поиск ошибок из-за его конкретного потока.

Так в чем была наша проблема?

В ранних прототипах TOEM каждое меню имело кнопки, которые явно ссылались на другое меню, в которое оно должно было «переходить» при нажатии.

Нет ничего плохого в этом подходе, когда у вас есть два или три меню, но что, если вы хотите, чтобы инвентарь открывал другое меню, которое открывает другое, подобное этому:

Нет меню > Инвентарь > Камера > Интерфейс альбома > Просмотреть фото

И в довершение ко всему, мы хотели иметь возможность вернуться в предыдущее меню!

Здесь ясно, что этот старый подход не только громоздкий, он вообще не подходит для изменения потока или итеративного процесса пользовательского интерфейса.

Решение: стопка меню!

Все меню TOEM присущи этому базовому классу.

Все меню упоминаются и хранятся в словаре внутри нашего MenuManager. Словарь содержит перечисление меню и скрипт.

Логика

Представьте, что это стопка книг. Каждый раз, когда вы хотите новую книгу, кладите ее поверх предыдущей.

Когда текущая книга не актуальна, закройте ее, удалите из стопки и откройте предыдущую, которая сейчас находится вверху.

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

Огромный плюс в том, что мы можем закрыть ВСЕ меню очень просто вот так.

При таком подходе нет необходимости во вложенных иерархиях GameObjects, сами меню могут быть автономными префабами, не имеющими никаких связей друг с другом.

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

Улучшения

  • Переместите меню в подход ScriptableObject
  • Создание префабов меню во время выполнения
  • Удалите ненужные меню после того, как они были использованы, например «Титульный экран».
  • Асинхронная/сопрограммная инициализация для более плавной загрузки экранов
  • Создайте общую подсказку меню пользовательского интерфейса, которую можно использовать для сценариев «Да/Нет».