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

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

Эта статья является одной из четырех частей руководства, посвящённого созданию игровых меню в Unreal Engine 5:
  1. Как сделать главное меню игры в Unreal Engine (UE5)
  2. Как сделать меню настроек в Unreal Engine (UE5)
  3. Как сделать меню выбора уровней в Unreal Engine (UE5)
  4. Как сделать меню паузы игры в Unreal Engine (UE5)

Файл сохранения непройденных уровней

Первым делом необходимо создать файл сохранения, который будет содержать данные о том, какие уровни нужно открыть. Сделать это просто: ПКМ — Blueprint Class — родительский класс Save. Файл я назвал SaveUnlockLevels.

После того, как файл был создан я добавил в него переменные с названиями уровней (количество переменных зависит от количества закрытых уровней в проекте), тип для которых задал булевый (Boolean). Названия переменных задал такие: Level_1_Unlock, Level_2_Unlock и т.д.

Создание меню выбора уровней

Для меню выбора уровней я решил сделать отдельный Widget Blueprint, который назвал «LevelSelect_WBP», но можно сделать внутри главного меню и переключать холсты, например, по нажатия на клавишу «Play». Меню я сделал при помощи обычных кнопок с вложенным в них текстом с названиями. А над кнопками со вторым, третьим и др. непройденными уровнями разместил красный кружок (Image) для обозначения, что эти уровни закрыты.

Затем, я создал привязки «замков» (условные иконки символизирующие закрытый уровень, в моем случае, это красный кружок) к функции видимости, которые назвал «Get_IMG_lvl_loc_1_Visibility_0», «Get_IMG_lvl_loc_2_Visibility_0» и т.д. Каждая такая функция имеет одну простую логику для проверки открытых уровней с одним лишь отличием — меняются переменные, которые были созданы в файле сохранения: Get_IMG_lvl_loc_1_Visibility_0 — Branch: ЕСЛИ ПРАВДА — Return Node (Hidden); ЕСЛИ ЛОЖЬ — Return Node (Visible). К переменной Branch во входящий пин Condition подключаем переменную Level_1_Unlock (созданную в файле сохранения), а к ней в свою очередь подключаем еще одну переменную, которую я создал типа SaveUnlockLevels, а назвал «Var_SaveUnlockLevels».

И такую логику создаем для каждой привязанной к иконке «замка» функции видимости, изменяя лишь переменные обозначающие уровень.

После, перейдя в Event Graph я настроил функциональность для кнопок с уровнями, у которых вызывал событие по нажатию «On Clicked». Первый уровень открывался сразу, так как он открыт, а все последующие имели проверку на доступность: On Clicked (Button_Level_1) — Is Valid (с подключенной переменной Var Save Unlock Levels) — Branch (с подключенной переменной Level_1_Unlock (Var Save Unlock Levels) ): ЕСЛИ ПРАВДА — Open Level — Remove from Parent (Self) — Set Focus to Game Viewport — Set Input Mode Game Only (Get Player Controller). Эти функции можно продублировать для всех остальных закрытых уровней изменяя лишь переменную уровня из файла сохранения (Level_1_Unlock, Level_2_Unlock, Level_3_Unlock и т.д.) и названия открываемых уровней в ноде Open Level.

Теперь необходимо настроить логику сохранения, которая будет начинаться с ноды события Event Construct. А также потребуется придумать названия слота сохранения. Итак, я создал следующую последовательность: Event Construct — Does Save Game Exist (название слота я такое: «Slot_SaveUnlockLevels») — Branch (Coundition связан с Return Value ноды Does Save Game Exist): ЕСЛИ ПРАВДА — Load Game from Slot (Slot_SaveUnlockLevels) — Cast To SaveUnlockLevels (связан с Load Game from Slot) — SET Var_SaveUnlockLevels (связанный с Cast To SaveUnlockLevels); ЕСЛИ ЛОЖЬ — Create Save Game Object (мой файл сохранения – SaveUnlockLevels) — Save Game to Slot (Slot_SaveUnlockLevels) — связывается с Load Game from Slot и всей последующей цепочкой.

Как я писал выше, в меню будет кнопка сброса прогресса игрока, то есть после нажатия на которую, слот сохранения должен удалиться, а пройденные уровни вновь оказаться недоступными. Для этого добавляем кнопке сбрасывающей прогресс событие по нажатию и создаем её функциональность: On Clicked (Button_Reset) — Delete Game in Slot (в моесм случае слот сохранения в этой ноде будет Slot_SaveUnlockLevels) — SET Level_1_Unlock (в Target подключаем Var_SaveUnlockLevels) — и далее все переменные из файла сохранения пройденных уровней. Стоит учесть, что в нодах SET Level_1_Unlock (и всех последующих) булевое значение должно быть ЛОЖЬЮ (False). Это возвратит значения переменных в исходные.

Создание пустого уровня для меню выбора уровней

Для отображения меню я создал пустой уровень, на который добавил камеру и стандартное освещение. Затем перешел в Level Blueprint и добавил следующую логику на уровень: Event Begin Play — Set View Target with Blend (в Target подключен Get Player Controller, а в New View Target – CineCameraActor взятая с уровня для меню) — Create Level Select WBP Widget (LevelSelect_WBP) — Add to Viewport — Set Input Mode UI Only (в Player Controller подключен Get Player Controller) — SET Show Mouse Cursor (True; в Target подключен Get Player Controller).

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

Great Creator