Skip to content
ambidexter-unity edited this page Mar 11, 2020 · 6 revisions

Tutorial Manager

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

Логика работы туториалов

Данный набор не предназначен для туториалов со сценарием. Подразумевается, что компонент, нуждающийся в пояснении, сам при своей инициализации пытается открыть туториал. Если туториал уже открывался и был завершен, то действие будет прервано и компонент продолжит свое нормальное исполнение. Таким образом каждый туториал имеет уникальную реализацию для компонента, последовательность появления туториалов зависит только от внутриигровой логики и никак не регламентируется менеджером.

ITutorialManager

Интерфейс менеджера. Главный метод bool SetCurrentPage(ITutorialPage) должен вызываться компонентом в момент инициализации. Метод принимает страницу туториала (см. ниже) и возвращает true, если страница туториала будет отображена, или false, если страница по какой-либо причине не отображается (туториал уже был показан или произошел технический сбой при загрузке).
Остальные методы интерфейса носят вспомогательный характер, и позволяют отследить текущее состояние: отображается ли в данное время туториал, идентификатор отображаемой страницы страницы.

ITutorialPage

Интерфейс страницы туториала. Не следует путать страницу туториала с экземпляром страницы туториала. Страница туториала несет в себе служебную идентификационную информацию (Id), метод для инстанцирования экземпляра страницы и событие завершения страницы туториала.
Страница туториала является более низкоуровневой абстракцией, нежели экземпляр страницы. Это обусловлено тем, что менеджер может отменить показ страницы туториала, причем это будет происходить в абсолютном большинстве случаев. Поэтому инстанцирование экземпляра страницы, подразумевающее загрузку ресурсов и ряд других действий, выделено в отдельный метод, который вызывается только в момент показа страницы туториала. Если страница не открывается, то вызов bool SetCurrentPage(ITutorialPage) сводится к проверке булевого флага.
Если менеджер решает отобразить страницу туториала, он вызывает ее метод bool InstantiatePage(Transform, Action<GameObject>). Если метод возвращает true, это означает, что страница будет создана. В этом случае ввод/вывод должен быть заблокирован, чтобы пользователь не имел возможности произвести какие-либо действия до показа страницы. Поскольку показ страницы туториала может быть сопряжен с задержкой на загрузку дополнительных ресурсов, метод сообщает о завершении инстанцирования через коллбек, в который возвращается экземпляр страницы.
Если bool InstantiatePage(Transform, Action<GameObject>) возвращает true, Менеджер начинает отслеживать событие CloseTutorialPageEvent страницы, чтобы отследить ее завершение. Решение о завершении страницы, как правило, возлагается на экземпляр страницы туториала. В событие CloseTutorialPageEventпередается флаг. Если флаг установлен, это означает, что страница завершилась и больше не должна отображаться, в противном случае требуется просто закрыть страницу, она будет повторно показана при последующем вызове bool SetCurrentPage(ITutorialPage).

Отключение туториала

Для отключения туториала достаточно задать в настройках проекта переменную среды DISABLE_TUTORIAL.

FrameImage

В дополнение к базовому набору присутствует графический компонент FrameImage, позволяющий создавать затенения с "окошками" для высветления участков сцены. Компонент представляет собой UI, похожий на Image, но разделенный на девять прямоугольных полигональных областей. Компоненту задается текстура, созданная таким образом, чтобы иметь в середине окно нужной формы.

image

FrameImage имеет поля FrameXMin, FrameXMax, FrameyMin, FrameYMax, позволяющие задавать границы "окна". Геометрия компонента перестраивается таким образом, чтобы центральный прямоугольный фрагмент соответствовал этим границам.

image

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