Найти в Дзене
Аня про Unreal Engine

Что такое Game Instance, Game Mode, Game State и Controller в Unreal Engine 5

Всем привет! Давайте на курочках 🐔разберемся, что такое Game Instance, Game Mode, Game State и Controller. Представьте, что мы разрабатываем небольшую игру про птицеферму, где игрок ухаживает за курочками, собирает яйца и продает их, чтобы купить новые породы кур, побольше корма, улучшить курятник и т.д. Каркас нашей игры будет выглядеть так: Game Instance — память всей игры. Когда игрок запускает игру, GameInstance активируется и живет до самого выхода из игры. Он хранит данные, которые не должны сбрасываться при смене уровней: баланс игрока (деньги, уровень здоровья и т.д.), список улучшений (новый курятник, кормушка, редкие породы), текущий день, настройки звука и управления. Так, если игрок приходит на рынок, покупает улучшение, а потом возвращается на ферму, то данные не теряются, а сохраняются в GameInstance. Однако когда игрок закрывает игру, данные GameInstance пропадают, если их не записать в SaveGame. GameInstance создается: Add → Blueprint Class → Game Instance. Устанавли
Оглавление

Всем привет! Давайте на курочках 🐔разберемся, что такое Game Instance, Game Mode, Game State и Controller. Представьте, что мы разрабатываем небольшую игру про птицеферму, где игрок ухаживает за курочками, собирает яйца и продает их, чтобы купить новые породы кур, побольше корма, улучшить курятник и т.д.

Каркас нашей игры будет выглядеть так:

Game Instance

Game Instance — память всей игры. Когда игрок запускает игру, GameInstance активируется и живет до самого выхода из игры. Он хранит данные, которые не должны сбрасываться при смене уровней: баланс игрока (деньги, уровень здоровья и т.д.), список улучшений (новый курятник, кормушка, редкие породы), текущий день, настройки звука и управления. Так, если игрок приходит на рынок, покупает улучшение, а потом возвращается на ферму, то данные не теряются, а сохраняются в GameInstance. Однако когда игрок закрывает игру, данные GameInstance пропадают, если их не записать в SaveGame.

GameInstance создается: Add → Blueprint Class → Game Instance.

Устанавливается: Project Settings → Maps & Modes → поле Game Instance Class.

Game Mode

Game Mode — правила уровня. Каждый уровень имеет свой GameMode. Он создается при загрузке уровня, а при переходе на другой уровень уничтожается.

GameMode создается: Add → Blueprint Class → Game Mode Base.

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

Основные настройки (вкладка Details) в GameMode:
— GameSession — используется преимущество в онлайн-играх и кооперативах, отвечает за подключение игроков, проверку лимитов игроков и т.д.
— Game State Class — хранит и передает текущее состояние уровня.
— Player Controller Class — хранит логику управления и взаимодействия игрока с миром (что происходит, когда игрок нажимает клавиши, кликает мышью и т.п.).
— Player State Class — хранит индивидуальные данные игрока (очки, инвентарь, прогресс и т.д.).
— HUD Class — задает интерфейс игры (панели, счетчики, кнопки, уровень здоровья и энергии).
— Default Pawn Class — определяет персонажа, которым управляет игрок.
— Spectator Class — указывает Pawn, который используется, когда игрок становится наблюдателем (например, после смерти персонажа).
— Replay Spectator Player Controller Class — контроллер, используемый при просмотре записи игры.
✔ Use Seamless Travel — включает плавный переход между уровнями, при котором игроки не отключаются от сессии, а их контроллеры и ключевые объекты сохраняются. Актуально для кооперативов и онлайн-игр.
✔ Start Players as Spectators — при входе в игру игрок появляется не сразу в роли персонажа, а как наблюдатель;
✔ Pauseable — игру можно ставить на паузу;
— Default Player Name — имя, которое получает игрок по умолчанию, если он не указал свое.

Устанавливается:
1) Для конкретного уровня: открываем нужную карту → Window → World Settings → поле GameMode Override.
2) По умолчанию: Edit → Project Settings → Maps & Modes → поле Default GameMode.

Для нашей игры создаем три отдельных GameMode:
1) Для главного меню.
Здесь не нужно загружать персонажа, HUD или GameState. Достаточно виджета с кнопками меню и одного PlayerController, который управляет курсором и переходами между экранами.
2) Для уровня с фермой.
В этом GameMode будет свой GameState_Farm, отвечающий за симуляцию фермерской жизни.
3) Для уровня с рынком.
К этому GameMode присоединим GameState_Market, который будет хранить и обрабатывать все торговые данные независимо от фермы.

Если бы ферма и рынок отличаются только декорациями и парой переменных, то для них можно было бы использовать один общий GameState и соответственно общий GameMode.

Game State

Game State — состояние уровня. Он отвечает за хранение и обновление всех переменных, относящихся к конкретной карте, и делится этими данными с другими системами (HUD, UI, геймплейным компонентам). GameState создается одновременно с GameMode и живет только в пределах текущего уровня. Как только игрок переходит на другую карту, старый GameState уничтожается, а новый создается заново.

В нашей игре будет два отдельных GameState:
1) GameState_Farm будет отслеживать таймеры кормления птиц, количество яиц, здоровье кур, чистоту и температуру в курятнике. К примеру, он может содержать переменную NumberOfEggs, хранящую текущее количество яиц. Когда игрок соберет несколько яиц, GameState_Farm обновит статистику. HUD и элементы интерфейса обратятся к этим данным, чтобы отобразить, сколько яиц собрано.
2) GameState_Market активируется, когда игрок переходит на уровень с рынком. Здесь уже другая логика: отслеживаются товары, динамические цены, ассортимент, время до закрытия лавок и другие параметры, которые мы задаем в этом уровне.

GameState создается: Add → Blueprint Class → Game State Base

Устанавливается:
1) Для конкретного уровня: World Settings → Game Mode Override → Game State
2) В GameMode → Game State Class.

Player State

Player State — паспорт игрока. Он создается для каждого игрока, когда тот входит в игру, и хранит всю индивидуальную информацию, которую нужно показывать или синхронизировать (ник, название команды, хп, инвентарь и т.д.). Если бы наша птицеферма была мультиплеерной игрой, то у каждого игрока был бы свой PlayerState.

Для нашей маленькой одиночной игры PlayerState необязателен. Проще и логичнее хранить глобальные данные (деньги, прогресс) в GameInstance.

PlayerState создается: Add → Blueprint Class → Player State.

Устанавливается:
1) Для конкретного уровня: World Settings → Game Mode Override → Player State Class.
2) В Game Mode → Player State Class.

Player Controller

Контроллеры управляют персонажами, представленными в виде Pawn или Character. Игрок управляет своим персонажем через PlayerController, а ИИ управляет НПС через AIController. В контроллере прописывается логика ввода: перемещение, взаимодействие, клик по кнопке, открытие меню, работа с курсором и интерфейсом.

Контроллер связывается с персонажем с помощью функции Possess, а при необходимости может освободить его через Unpossess.

Если логика игры простая, например, игрок управляет шариком, то можно использовать дефолтный контроллер. Однако при более сложном поведении персонажа (бег, приседание, стрельба, вождение транспорта и т.д.), создание кастомного PlayerController становится необходимым. Напомню, что если в GameMode не задан кастомный PlayerController и в настройках проекта (Project Settings) по умолчанию не установлен контроллер, Unreal Engine автоматически назначит стандартный дефолтный PlayerController.

PlayerController создается: Add → Blueprint Class → Player Controller.

Устанавливается:
1) Для конкретного уровня: World Settings → Game Mode Override → Player Controller Class
2) В GameMode → Player Controller.

Таким образом, на примере игры про птицеферму мы рассмотрели каркас игры: GameInstance хранит общий контекст, GameMode задает правила уровня, GameState отслеживает текущие параметры уровня, PlayerController управляет процессом, а Pawn/Character воплощает действия игрока в мире.