В процессе изучения основ Unreal Engine, обязательно ознакомьтесь с тем, как работает Инфраструктура игрового процесса Unreal Engine. В этом разделе рассказывается о том, как настроить классы состояния и режим игры в проекте Parrot.
Режим игры
Режимом игры определяются основные правила игры, такие как общее количество игроков или то, как игроки вступают в игру. Он также предоставляет инфраструктуру для создания полезных классов игры, таких как состояние игры, контроллер игрока, HUD-интерфейс и класс пешки по умолчанию.
Чтобы настроить режим игры для проекта Parrot, выполните следующие шаги:
В Каталоге ресурсов выберите Содержимое > Blueprints > Game.
Щёлкните правой кнопкой мыши в каталоге и выберите Класс Blueprint.
В качестве родительского класса задайте AGameModeBase.
Назовите класс BP_ParrotGameMode.
Дважды нажмите на только что созданную схему, чтобы отобразить основные классы, которые в ней определены. Конкретно для игры Parrot будет необходимо внести некоторые изменения:
для поля Класс состояния игры мы зададим BP_ParrotGameState;
для поля Класс контроллера игрока мы зададим BP_ParrotPlayerController;
для поля Класс HUD мы зададим BP_ParrotHUD;
для поля Класс пешки по умолчанию мы зададим BP_ParrotPlayerCharacter.
Перейдите в раздел Правка > Настройки проекта > Карты и режимы и для поля Режим игры по умолчанию установите BP_ParrotGameMode.
Режим игры настроен, поэтому можем приступить к настройке состояния игры.
Состояние игры
Состояние игры обрабатывает то, что в данный момент происходит в самой игре. Сюда входит управление данными, которые должны получить клиенты, без привязки к какому-либо конкретному игроку. К примеру, здесь можно хранить количество очков, которое набрала та или иная команда.
Для создания состояния игры для проекта Parrot выполните следующие шаги:
В главном редакторе выберите «Инструменты» > «Новый класс C++…»
В качестве родительского класса задайте AGameStateBase.
Назовите класс AParrotGameState.
В «Каталоге ресурсов» выберите + Добавить > Класс Blueprint.
В качестве родительского класса задайте AParrotGameState.
Назовите класс BP_ParrotGameState.
В схеме режима игры задайте BP_ParrotGameState в поле состояния игры.
Разбор принципов работы режима и состояния игры
Более подробно режим игры и состояние игры разобраны в статье Режим и состояние игры. По мере создания новых классов, не забывайте обновлять режим и состояние игры.
Режим игры также можно задать с учётом используемой карты. Главное меню в игре Parrot использует режим игры, отличающийся от того, который используется непосредственно на игровых уровнях.
Экземпляр игры
Экземпляр игры — это сохраняемый одиночный экземпляр класса в движке, который обрабатывает функции проекта. Он существует в течение всего времени жизни приложения. Он содержит клиент окна просмотра игры и локального игрока.
По тому же принципу, что и в случае с режимом и состоянием игры, создаётся базовый класс C++ (UParrotGameInstance) и класс Blueprint (BP_ParrotGameInstance). Задать класс экземпляра игры в проекте можно в меню «Правка»->«Настройки проекта»->«Карты и режимы».
Для создания экземпляра игры Parrot выполните следующие шаги:
В главном редакторе выберите «Инструменты» > «Новый класс C++…»
В качестве родительского класса задайте UGameInstance.
Назовите класс UParrotGameInstance.
В «Каталоге ресурсов» выберите + Добавить > Класс Blueprint.
В качестве родительского класса задайте UParrotGameInstance.
Назовите класс BP_ParrotGameInstance.
Перейдите в меню «Правка» > «Настройки проекта» > «Карты и режимы» и задайте BP_ParrotGameInstance в качестве класса экземпляра игры.
Пример подгрузки уровня
Карты в игре Parrot связаны с различными режимами игры, при этом экземпляр игры сообщает игре, какую карту необходимо найти при помощи файлов UParrotMapDataAsset. Это ресурсы данных с мягким указателем на файл карты. Эти ресурсы организованы в экземпляре игры и игрок может перебирать их по мере прохождения игры. Поскольку всё это находится в экземпляре игры, вы всегда можете подгрузить следующий уровень из любого места. Контроллер игрока прослушивает изменения состояния игры и при необходимости обращается к экземпляру игры.
На скриншоте ниже представлена схема, в которой используются узлы Stream Level (подгрузка уровня) и Async Load Asset (асинхронная загрузка ресурсов) для асинхронной загрузки мягкой ссылки на ParrotMapDataAsset. После этого узел Open Level (Открыть уровень) вызывается без ожидания синхронной загрузки, поскольку сам уровень уже был успешно подгружен. Здесь также используется плагин CommonLoadingScreen. Виджет экрана загрузки будет вызван при предварительной загрузке следующей карты и удалён на этапе после загрузки.
Более подробно об экране загрузки, а также о том, почему в игре Parrot выполняется асинхронная загрузка, вместо синхронной, которая используется здесь, рассказано в разделе документации Пользовательский интерфейс для игры Parrot.