Класс Controller (контроллер) в Unreal Engine

Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим класс Controller в Unreal Engine (UE5, UE4), реализующий базовую логику управления объектами Pawn.

Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.

Controller

Класс Controller в Unreal Engine (UE5, UE4)
Класс Controller в Unreal Engine (UE5, UE4)

Класс Controller (контроллер) в Unreal Engine — это абстрактный базовый класс, который реализует общую логику управления объектами класса Pawn для двух основных дочерних классов: Player Controller, обрабатывающего ввод игроков, и AI Controller, принимающего решения на основе ИИ.

* Абстрактный класс (Abstract Class) в Unreal Engine (UE5, UE4) — это класс, объект которого не может быть создан напрямую. Он служит в качестве основы или шаблона для других, более конкретных (неабстрактных) классов.

В целом же любые контроллеры (Controllers) в Unreal Engine не имеют физического представления в мире, но при этом находятся в нём. Они могут овладевать объектами Pawn и управлять их действиями. Используются контроллеры для отделения логики управления Pawn от самого Pawn. Это позволяет:

  • легко переключать управление между разными Pawn;
  • реализовывать разные типы управления (игрок, ИИ) для одного и того же Pawn;
  • обрабатывать ввод и события, связанные с Pawn, в контроллере, что делает код более модульным и масштабируемым.

Перевод официальной справки: Controller — это нефизические Акторы, которые могут овладевать объектами класса Pawn для управления их действиями.

Взаимодействие между Controller (контроллером) и Pawn в Unreal Engine строится на механизмах овладевания (Possess) и открепления (Un Possess).

Когда контроллер начинает управлять Pawn, он вызывает внутреннюю функцию Possess(). Эта функция проверяет, есть ли у контроллера необходимые полномочия (например, авторитет на сервере). Если всё в порядке, контроллер сначала открепляется от предыдущего Pawn, если он был, чтобы избежать конфликтов. Затем вызывается еще одна внутренняя функция OnPossess(), где происходит основная логика овладевания: если Pawn уже был под управлением другого контроллера, тот он освобождается от него и получает ссылку на текущий новый контроллер. А сам контроллер овладевает этим Pawn. В этот момент срабатывают различные Blueprint-события, которые разработчик может обрабатывать в логике Blueprint. Например, Event Possess — событие о смене Pawn у контроллера.

Когда контроллер овладевает Pawn, он становится главным источником команд для этого объекта: именно через контроллер обрабатывается ввод игрока или логика ИИ. Контроллер хранит ссылку на текущий Pawn, а также ссылку на Player State — объект, содержащий сетевую информацию о состоянии игрока (например, имя, очки и т. д.). Все эти данные автоматически синхронизируются между сервером и клиентами.

Контроллер отвечает за такие задачи, как обработка движения, поворота, проверка видимости других Акторов (Line Of Sight To), управление состояниями (например, заморозка движения или обзора), а также за смену Pawn. Как уже упоминалось ранее, при смене Pawn или контроллера срабатывают специальные события (делегаты), которые позволяют разработчикам реализовать нужную игровую логику как в C++, так и в Blueprint в момент возникновения данных процессов.

Контроллер может в любой момент открепиться от Pawn с помощью внутренней функции UnPossess(). При этом обе стороны (и контроллер, и Pawn) обновляют свои ссылки друг на друга, сбрасывают Player State и компоненты ввода, если это необходимо. Опять же, благодаря системе событий и делегатов, разработчики могут легко реагировать на любые изменения — например, запускать анимации, обновлять интерфейс или менять поведение ИИ.

Таким образом, Controller — это «мозг», который управляет Pawn, обеспечивает связь между игроком (или ИИ) и игровым персонажем, а также поддерживает корректную работу сетевых и игровых механик.

Ключевая функциональность базового класса Controller

  • Possess/UnPossess — захват и освобождение объекта Pawn для управления им.
  • Control Rotation — управление направлением контроллера.
  • Input Ignored — блокировка обработки ввода.
  • Navigation — реализация интерфейса Nav Agent Interface, что позволяет контроллерам взаимодействовать с системой навигации.
  • Player State Reference — хранение ссылки на объект Player State, содержащий информацию о состоянии игрока.
  • Replication Reference — репликация ключевых свойств (например, Player State, Pawn).
  • Replication Function — репликация функций изменения позиции или поворота Pawn (например, ClientSetLocation, ClientSetRotation) и событий, вызываемых когда контроллер овладевает Pawn или теряет управление (например, OnPossessedPawnChanged).

Наследование классов

Родительские классы и интерфейсы

Класс Controller наследуется от класса Actor (базовый класс для объектов, размещаемых на игровом уровне), расширяя его базовую логику функционалом захвата объектов Pawn для управления ими.

Класс Controller наследуется от класса Actor, расширяя его базовую логику функционалом захвата объектов Pawn для управления ими
Класс Controller наследуется от класса Actor, расширяя его базовую логику функционалом захвата объектов Pawn для управления ими

Помимо базового родительского класса Actor, Controller также наследует интерфейс INavAgentInterface.

* Nav Agent Interface — интерфейс, используемый объектами, которые представляют собой агентов навигации (персонажи, перемещающиеся по навигационной сетке). Он предоставляет навигационной системе необходимую информацию о свойствах агента, его местоположении и параметрах для проверки достижения цели.

Дочерние классы

Вследствие своей абстрактности, класс Controller является родительским классом для более специализированных классов контроллеров:

  • Player Controller — контроллер для управления Pawn игроком. Данный контроллер принимает ввод с клавиатуры, мыши или геймпада и преобразует его в действия в игре. Обычно Player Controller управляет Pawn или персонажем, который становится визуальным представлением игрока в мире.
  • AI Controller — контроллер для управления Pawn с помощью искусственного интеллекта. Данный контроллер управляет неигровыми персонажами (NPC). Если Pawn или персонаж не находится под контролем игрока, по умолчанию ему назначается базовый AI Controller, если только явно не указано иное.

Переменная Player State в классе Controller

Переменная Player State в классе Controller
Переменная Player State в классе Controller

Переменная Player State в классе Controller это ссылка на объект класса Player State, который отвечает за хранение и репликацию информации о состоянии игрока, использующего данный контроллер. А именно, содержит такие данные, как имя игрока, очки, статистику и другую важную информацию для сетевой игры. Важно: Player State создаётся только для контроллеров игроков (Player Controller), а не для NPC (AI Controller).

В Controller свойство Player State помечено для сетевой репликации. Это значит, что когда на сервере Player State изменяется, это изменение автоматически передаётся всем клиентам.

Player State тесно связан с контроллером: при овладении Pawn контроллер передаёт ему ссылку на свой Player State, чтобы Pawn мог обращаться к сетевой информации об игроке. Благодаря репликации, все изменения в Player State (например, изменение очков или имени) мгновенно становятся видимы всем участникам сетевой игры.

Таким образом, Player State — это основной механизм хранения и синхронизации информации о каждом игроке в мультиплеере Unreal Engine, а Controller обеспечивает правильную передачу и обновление этой информации между сервером и клиентами.

Свойство Attach To Pawn в классе Controller

Свойство Attach To Pawn в классе Controller
Свойство Attach To Pawn в классе Controller

Свойство Attach To Pawn в классе Controller определяет, будет ли позиция контроллера автоматически совпадать с позицией управляемого Pawn. Если этот флаг установлен в значение True, контроллер физически прикрепляется к Pawn: его положение всегда обновляется и совпадает с позицией Pawn, пока продолжается управление этим объектом. Важно: при этом поворот контроллера (Control Rotation) всегда соответствует его собственному значению, независимо от положения Pawn.

Это поведение полезно, если нужно привязать к контроллеру какой-либо объект или компонент, который должен точно следовать за Pawn, но при этом иметь независимый полный поворот (например, для систем наведения, индикаторов, камер или других вспомогательных Акторов). Важно отметить, что сам контроллер обычно не виден в мире и его позиция не используется напрямую для игрового процесса, однако благодаря свойству Attach To Pawn можно реализовать дополнительные механики, связанные с отслеживанием позиции Pawn на уровне контроллера.

Если же свойство выключено (False), позиция контроллера не будет обновляться за Pawn, а поворот всё также будет задаваться свойством Control Rotation.

Blueprint-события класса Controller

Blueprint-события класса Controller
Blueprint-события класса Controller
  • Event Possess — событие вызывается каждый раз, когда контроллер начинает управлять новым Pawn (то есть происходит процесс Possess).
  • Event Un Possess — событие вызывается каждый раз, когда контроллер перестаёт управлять Pawn (то есть происходит процесс Un Possess).
  • Event Receive Instigated Any Damage — событие вызывается каждый раз, когда данный контроллер становится инициатором любого урона в игре.

Blueprint-функции класса Controller

Rotation

Функции управления направлением (Rotation)
Функции управления направлением (Rotation)
  • Get Control Rotation — возвращает текущий поворот контроллера.
  • Set Control Rotation — устанавливает новый поворот контроллера.
  • Get Desired Rotation — возвращает желаемый (целевой) поворот Pawn, которым управляет контроллер. Используется для получения того угла, к которому должен стремиться повернуться Pawn под управлением данного контроллера.

View

Функции управления обзором (View)
Функции управления обзором (View)
  • Get Player View Point — возвращает точку обзора игрока. Для AI возвращает позицию и поворот «глаз» Pawn (точка зрения ИИ). Для игрока возвращает позицию и поворот камеры (точка зрения человека-игрока).
  • Get View Target — возвращает текущий объект, который используется для вычисления точки обзора контроллера. Это может быть управляемый Pawn, камера или другой объект, выбранный как текущая цель обзора для данного контроллера.

Controller Type

Функции проверки типа контроллера (Controller Type)
Функции проверки типа контроллера (Controller Type)
  • Is Player Controller — возвращает значение True, если данный контроллер является Player Controller.
  • Is Local Player Controller — возвращает значение True, если данный контроллер является локальным Player Controller (то есть контроллером игрока, который управляется непосредственно на этом клиенте/устройстве).
  • Is Local Controller — возвращает значение True, если данный контроллер является локальным (то есть контроллером, который управляется непосредственно на этом клиенте/устройстве).

Input Management

Функции управления вводом (Input)
Функции управления вводом (Input)
  • Is Look Input Ignored — возвращает значение True, если контроллер в данный момент игнорирует ввод, связанный с изменением направления взгляда (Look Input).
  • Is Move Input Ignored — возвращает значение True, если контроллер в данный момент игнорирует ввод, связанный с движением (Movement Input).
  • Set Ignore Look Input — блокирует обработку ввода, связанного с изменением направления взгляда (Look Input):
    • True: ввод взгляда игнорируется. Множественные вызовы функции со значением True накладываются друг на друга (Stack Up). Чтобы полностью вернуть управление, требуется столько же вызовов со значением False, либо можно сбросить всё сразу через функцию Reset Ignore Look Input.
    • False: ввод взгляда снова разрешён.
  • Set Ignore Move Input — блокирует обработку ввода, связанного с движением (Movement Input):
    • True: ввод движения игнорируется. Множественные вызовы функции со значением True накладываются друг на друга (Stack Up). Чтобы полностью вернуть управление, требуется столько же вызовов со значением False, либо можно сбросить всё сразу через функцию Reset Ignore Move Input.
    • False: ввод движения снова разрешён.
  • Reset Ignore Input Flags — сбрасывает флаги игнорирования ввода для движения (Movement Input) и обзора (Look Input). После вызова этой функции контроллер снова начинает обрабатывать ввод для перемещения и изменения направления взгляда.
  • Reset Ignore Look Input — сбрасывает состояние игнорирования ввода обзора (Look Input). После вызова этой функции контроллер снова начинает обрабатывать ввод, связанный с изменением направления взгляда.
  • Reset Ignore Move Input — сбрасывает состояние игнорирования ввода для движения (Movement Input). После вызова этой функции контроллер снова начинает обрабатывать ввод для перемещения.

Possess Pawn

Функции овладевания Pawn (Possess)
Функции овладевания Pawn (Possess)
  • Possess — прикрепляет (привязывает) данный контроллер к указанному Pawn, чтобы начать управлять им.
  • Un Possess — освобождает (разрывает связь) контроллера с управляемым Pawn по любой причине, кроме уничтожения Pawn (случай уничтожения обрабатывается отдельно через Pawn Destroyed).
  • Get Controlled Pawn — возвращает ссылку на Pawn, которым в данный момент управляет этот контроллер.

Другие функции

Другие функции
Другие функции
  • Line Of Sight To — проверяет, есть ли прямая видимость (Line of Sight) между Pawn, управляемым этим контроллером, и другим Актором. Возвращает значение True, если управляемый контроллером Pawn может видеть указанный Актор — то есть между ними нет препятствий.
  • Stop Movement — немедленно прерывает текущее движение, выполняемое контроллером.
  • Set Initial Location And Rotation — устанавливает начальное положение и поворот контроллера. Обычно вызывается сразу после создания контроллера, чтобы корректно разместить его в нужную позицию и ориентацию в игровом мире.

Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.


наш Телеграм канал

Оцените статью
( 1 оценка, среднее 5 из 5 )
Поделитесь этой статьей со своими знакомыми в социальных сетях, возможно, эта статья кому-то будет полезна
Unreal Engine - это просто
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.