Player Controller в Unreal Engine

Содержание
  1. Player Controller
  2. Ключевая функциональность класса Player Controller
  3. Наследование классов
  4. Репликация Player Controller и объект Player State
  5. Как создать и подключить Player Controller в Unreal Engine
  6. Как получить Player Controller персонажа в UE5 (функция Get Player Controller)
  7. Настройки Details для Player Controller (class Defaults)
  8. Cheat Manager
  9. Input
  10. Player Controller
  11. Mouse Interface
  12. Game
  13. World Partition
  14. Controller
  15. Blueprint-функции класса Player Controller
  16. Event (Blueprint-события)
  17. Input Rotation (управление вращением ввода)
  18. Input State (состояние ввода)
  19. Cursor (курсор и трассировка)
  20. Convert Location(преобразование координат)
  21. Mobile Input (мобильный ввод)
  22. Audio (параметры звука)
  23. Feedback: Camera (обратная связь камеры)
  24. Feedback (обратная связь контроллеров)
  25. HUD
  26. Deprecated Input (устаревшие настройки ввода)
  27. Streaming Source (настройка источника стриминга)
  28. Другие функции
  29. Функции Possess и Un Possess
  30. Практика в Unreal Engine №1. Смена персонажа у PlayerController через Blueprint
  31. Практика в Unreal Engine №2. Переопределение событий «On Possess» и «On UnPossess» в классе PlayerController
  32. Практика в Unreal Engine №3. Ограничиваем Pitch камеры у игрока. Player Camera Manager

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

Но прежде чем детально изучать контроллер игрока, рекомендую также ознакомится с общим классом контроллеров: Controller.

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

Player Controller

Player Controller (контроллер игрока) — класс контроллера, который владеет объектом игрока в Unreal Engine и связывает ввод пользователя (клавиатура, мышь, геймпад и т.д.) с действиями в игре, такими как управление персонажем (Pawn), камерой, интерфейсом (HUD) и другими аспектами игрового процесса.

Перевод официальной справки: Player Controller используются игроками для управления Pawn (персонажами).

Player Controller в Unreal Engine — это невидимый, нефизический Актор в игровом мире, отвечающий за владение объектами класса Pawn и его наследниками, такими как Character. Хотя сам контроллер игрока не имеет визуального представления в 3D-сцене, он всё-равно присутствует в нём и служит основным интерфейсом между пользовательским вводом (с клавиатуры, мыши, геймпада и других устройств) и игровым персонажем.

Player Controller может взять под управление любой Pawn в игре с помощью метода Possess, который может быть вызван вручную, автоматически через Game Mode или через настройки самого Pawn. Это управление продолжается до тех пор, пока контроллер игрока не вызовет метод Un Possess, либо не переключится на другой Pawn. Таким образом, в каждый момент времени Player Controller может управлять только одним Pawn, и у каждого Pawn может быть не более одного Player Controller.

Когда контроллер игрока берёт под контроль Pawn с помощью функции Possess, он не только может получать уведомления от движка о ключевых игровых событиях, происходящих с этим Pawn — таких как столкновения, получение урона, смерть и другие, что позволяет разработчику добавлять собственную логику реакции и изменять стандартное поведение, — но также начинает управлять камерой игрока, отображением интерфейса игрока (HUD), обработкой пользовательского ввода игрока, а в случаях с World Partition — и подгрузкой мира вокруг Pawn игрока.

В архитектуре Unreal Engine предусмотрено два основных типа контроллеров: Player Controller (для управления игроком-человеком) и AI Controller (для управления персонажами с помощью искусственного интеллекта). Оба класса наследуются от базового класса Controller. Основное различие заключается в том, что контроллер игрока ориентирован на обработку пользовательского ввода и взаимодействие с Pawn игрока, тогда как AI Controller реализует автономное поведение для NPC и ботов.

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

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

  • Player State Management (обработка состояния игрока)Player Controller взаимодействует с важнейшими сущностями — Player State (состояние игрока), Player Input (ввод игрока), Pawn (представление игрока в игре), Net Connection (сетевое соединение для игрока) и другими объектами, управляющими состоянием и связью.
  • Input Handling (управление вводом) — поддерживает ввод игрока (клавиатура, мышь, геймпад, сенсор), используя встроенный объект Player Input и связанные структуры/классы (Input Component, Enhanced Input).
  • Camera Control (работа с камерой) — управляет камерой игрока через внутренний объект Player Camera Manager, который определяет логику расположения и поворота камеры.
  • HUD and UI Integration (работа с HUD и UI) — обеспечивает связь с HUD игрока и участвует в отображении интерфейса и обработке событий ввода в UI.
  • World Partition Support (поддержка World Partition) — может быть стриминговым источником для World Partition через интерфейс World Partition Streaming Source Provider.
  • Network Synchronization & RPC (сетевая синхронизация и RPC)Player Controller активно участвует в сетевом взаимодействии. Он существует как на сервере (для каждого игрока), так и на клиенте-владельце, управляющем конкретным игроком. Поддерживает RPC для синхронизации событий (включение/выключение голосового чата, возврат игрока в главное меню, выполнение команд на сервере в не-релизных сборках). Обеспечивает синхронизацию параметров (скорости сетевого соединения, позиции камеры, управления стримингом).
  • Cheats & Debug (работа с тестированием и читами) — предоставляет функционал для тестирования и отладки: поддержка читов, отладочных сообщений, консольных команд.
  • Input Mode Handling (управление состоянием и режимами ввода) — позволяет управлять фокусом, блокировкой мыши и видимостью курсора, а также отвечает за смену режимов ввода (Input Mode), что позволяет переключаться между разными состояниями:
    • Game Only — ввод обрабатывается только игровым процессом;
    • UI Only — ввод обрабатывается только интерфейсом.
    • Game and UI — обработка ввода и в игре, и в UI.

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

Класс Player Controller наследуется от класса Controller (реализующего базовую логику управления объектами Pawn), расширяя его функционалом обработки пользовательского ввода (с клавиатуры, мыши, геймпада, т.д.) и связки этого ввода с управлением Pawn, а также взаимодействия с камерой, HUD и сетевой логикой, что делает его центральным звеном менеджмента ввода игрока-человека.

Player Controller наследуется от класса Controller, расширяя его функционалом обработки пользовательского ввода (с клавиатуры, мыши, геймпада, т.д.) и связки этого ввода с управлением Pawn, а также взаимодействия с камерой, HUD и сетевой логикой
Player Controller наследуется от класса Controller, расширяя его функционалом обработки пользовательского ввода (с клавиатуры, мыши, геймпада, т.д.) и связки этого ввода с управлением Pawn, а также взаимодействия с камерой, HUD и сетевой логикой

Помимо этого, Player Controller также наследует интерфейс IWorldPartitionStreamingSourceProvider.

* World Partition Streaming Source Provider — интерфейс, предоставляющий параметры и местоположение стримингового источника для системы World Partition, чтобы в реальном времени управлять подгрузкой необходимых частей мира для игрока.

Репликация Player Controller и объект Player State

Помимо управления игровым вводом, контроллер игрока играет центральную роль в сетевом взаимодействии в многопользовательских проектах Unreal Engine.

Для каждого подключённого игрока в сессии на сервере создаётся отдельный экземпляр Player Controller, который отвечает за обработку пользовательского ввода, синхронизацию камеры, выполнение RPC-вызовов и управление игровым состоянием. На стороне клиента также существует собственный экземпляр Player Controller, предназначенный исключительно для локального взаимодействия — он обрабатывает ввод с устройств, управляет камерой и отображает игровую сцену. При этом Player Controller игрока не существует на клиенте другого игрока, что обеспечивает изоляцию управления и безопасность сетевого взаимодействия.

Таблица распределения классов фреймфорка Unreal Engine (UE4, UE5) по тому, где существует объект этого класса. В данном случае Player Controller существует на сервере и клиенте-владельце.
Таблица распределения классов фреймфорка Unreal Engine (UE4, UE5) по тому, где существует объект этого класса. В данном случае Player Controller существует на сервере и клиенте-владельце.

Поскольку экземпляр Player Controller каждого игрока доступен только на сервере и на клиенте-владельце, для обмена общей игровой информацией между всеми участниками сессии используется специальный объект — Player State.

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

Такая архитектура обеспечивает надёжную основу для построения мультиплеерных игр. Player Controller отвечает за выполнение RPC-методов, таких как ClientSetCamera, ServerMutePlayer(), ClientEnableNetworkVoice(), которые позволяют синхронизировать действия и команды между клиентом и сервером. Player State, в свою очередь, гарантирует, что критически важная информация доступна всем участникам сессии, позволяя реализовывать функциональность, зависящую от состояния игроков, например, подсчёт очков, отображение списка игроков, голосовое общение и муты. Вместе эти компоненты формируют гибкую и безопасную сетевую архитектуру, лежащую в основе многопользовательских игр в Unreal Engine.

Как создать и подключить Player Controller в Unreal Engine

Создание собственного класса Player Controller в Unreal Engine — процесс достаточно простой. Откройте Content Browser, вызовите контекстное меню правой кнопкой мыши и выберите Blueprint Class. В появившемся диалоговом окне Pick Parent Class кликните по кнопке Player Controller. После этого можно настроить свой класс контроллера, реализовав уникальную логику управления игроком.

Как создать Player Controller в Unreal Engine (UE4, UE5)
Как создать Player Controller в Unreal Engine (UE4, UE5)

Однако важно не только создать свой контроллер, но и правильно назначить его для объектов Pawn или Character. За это отвечает класс Game Mode, который определяет используемые по умолчанию игровые классы.

Чтобы подключить свой Player Controller:

  1. Откройте используемый в проекте Game Mode.
  2. Перейдите в меню Class Defaults, затем во вкладку Details и раздел Classes.
  3. В настройке Player Controller Class выберите собственный класс контроллера из выпадающего списка.
Установка пользовательского класса Player Controller в GameMode
Установка пользовательского класса Player Controller в GameMode

Теперь именно этот класс Player Controller будет назначаться всем новым игрокам при запуске игры.

Если в вашем проекте ещё нет собственного Game Mode, создайте его аналогично процессу создания Player Controller: через Blueprint Class с выбором родительского класса Game Mode. Затем подключите этот Game Mode в настройках проекта:
Edit / Project Settings / Maps & Modes / Default GameMode.

Подключение пользовательского класса GameMode
Подключение пользовательского класса GameMode

Как получить Player Controller персонажа в UE5 (функция Get Player Controller)

Чтобы получить контроллер игрока для персонажа в Unreal Engine 5, используйте Blueprint-функцию Get Player Controller.

Функция Get Player Controller в Unreal Engine (UE4, UE5)
Функция Get Player Controller в Unreal Engine (UE4, UE5)

Функция Get Player Controller возвращает ссылку на объект класса Player Controller, который управляет указанным игроком. Поскольку в проекте может быть несколько игроков, функция позволяет указать индекс игрока (Player Index) — по умолчанию 0, что соответствует первому игроку.

В зависимости от контекста выполнения, результат работы функции может отличаться:

  • Client (на клиенте) — функция возвращает Player Controller, принадлежащий именно этому клиенту, независимо от того, какое значение индекса было передано.
  • Server (на сервере) — функция возвращает контроллер игрока, связанный с указанным индексом. Индекс 0 может относиться к серверному слушателю или первому подключённому клиенту, в зависимости от реализации.

Поскольку функция возвращает ссылку на объект базового класса Player Controller, для доступа к пользовательским функциям и переменным вашего собственного контроллера необходимо использовать приведение типа (Cast) к вашему Blueprint-классу (например, Cast to BP_MyPlayerController).

Скриншот

Функция Get PlayerController: получаем текущий BP_MyPlayerController с использованием каста Cast to BP_MyPlayerController

Функция Get PlayerController: получаем текущий BP_MyPlayerController с использованием каста Cast to BP_MyPlayerController

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Для более продвинутых сценариев стоит рассмотреть использование Blueprint Interfaces, чтобы получать ссылку на нужный Player Controller независимо от конкретного класса. Для этого создайте собственный интерфейс, добавьте в контроллер нужную интерфейсную функцию (например, Get Custom PlayerController) и пользуйтесь ей там, где это необходимо.

Скриншот

Функция Get PlayerController: получаем текущий BP_MyPlayerController с использованием пользовательского интерфейса Get Custom PlayerController

Функция Get PlayerController: получаем текущий BP_MyPlayerController с использованием пользовательского интерфейса Get Custom PlayerController

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Настройки Details для Player Controller (class Defaults)

В меню Details содержатся как унаследованные параметры от класса Actor, так и настройки, характерные для разбираемого класса контроллера игрока. Details для Actor мы уже разбирали в соответствующей статье про класс Акторов. Здесь же сконцентрируемся на настройках Player Controller.

Cheat Manager

Свойства категории Cheat Manager во вкладке Details
Свойства категории Cheat Manager во вкладке Details
  • Cheat Class — определяет класс менеджера читов (Cheat Manager), который будет использоваться этим контроллером игрока.

* Cheat Manager — это объект, управляющий выполнением «читерских» команд в Unreal Engine, который позволяет разработчикам и тестировщикам использовать специальные команды для отладки и тестирования игры, причем его доступность зависит от типа сборки и игровых настроек.

Input

Свойства категории Input во вкладке Details
Свойства категории Input во вкладке Details
  • Enable Motion Controls — определяет, учитывать ли ввод от устройств с датчиками движения (таких как гироскоп, акселерометр и т.п.). Если свойство установлено в значение True, контроллер игрока будет принимать во внимание данные от источников движения при обработке пользовательского ввода.
  • Override Player Input Class — позволяет указать пользовательский класс Player Input для обработки ввода вместо класса, заданного в настройках ввода (Input Settings) как Default Player Input Class.
  • Block Input (свойство наследуется от класса Actor) — определяет, будет ли этот Актор блокировать обработку входных данных (Input) для всех Акторов, находящихся ниже него в стеке Input-обработчиков.
    • True: все входные события (нажатия клавиш, мыши, геймпада и т.д.), которые могли бы быть обработаны другими Акторами с меньшим приоритетом (ниже в стеке), будут игнорироваться. То есть этот Актор «перехватывает» Input, и остальные, нижестоящие Акторы в стеке его не получат.
    • False: входные события будут передаваться дальше по стеку, и другие Акторы также смогут их обработать.
  • Auto Receive Input (свойство наследуется от класса Actor) — определяет, будет ли Актор автоматически регистрироваться для получения входных данных (Input) от игрока при запуске игры или при спавне. Это удобно для быстрого подключения Актора к Input-системе без необходимости вручную вызывать методы регистрации. По умолчанию Disabled — отключено. Для того, чтобы включить, необходимо выбрать номер Игрока (Player 0-7).
  • Input Priority (свойство наследуется от класса Actor) — определяет приоритет этого Актора при обработке входных данных (Input) в стеке Input-объектов. Чем выше значение, тем раньше этот Актор получит возможность обработать событие Input по сравнению с другими Акторами, зарегистрированными на тот же источник ввода.

Player Controller

Свойства категории Player Controller во вкладке Details
Свойства категории Player Controller во вкладке Details
  • Player Camera Manager Class — определяет, какой класс менеджера камеры игрока будет использоваться для данного контроллера. Если свойство не задано, по умолчанию используется класс, указанный в настройках движка как Engine.PlayerCameraManager.
  • Auto Manage Active Camera Target — определяет, будет ли этот контроллер игрока автоматически управлять целью камеры.
    • True: контроллер сам выбирает и обновляет цель камеры (например, при смене Pawn). Обычно это подконтрольный Pawn.
    • False: разработчик вручную управлять тем, на какой объект направлена камера.

* Camera Target — это объект, на который направлена камера игрока и за которым она следует в процессе игры. По факту, это тот Актор, через который в текущий момент смотрит камера. В контексте класса Player Controller, по умолчанию в качестве цели камеры используется управляемый Pawn, но разработчик может вручную задать другой объект в качестве цели камеры, если автоматическое управление отключено. Таким образом, Camera Target определяет, какой игровой объект будет центром внимания камеры для данного игрока.

  • Smooth Target View Rotation Speed — определяет скорость, с которой происходит интерполяция (плавное сглаживание) между текущим вращением камеры (или управления) на клиенте и целевым вращением, полученным от сервера. В сетевых играх вращение вида (Control Rotation) реплицируется с сервера на клиент. Однако из-за сетевой задержки прямое применение значений может привести к резким рывкам. Чтобы избежать этого, используется интерполяция. При получении нового Target View Rotation (через репликацию) клиент не сразу применяет его, а плавно интерполирует текущее вращение к целевому значению.
  • Should Perform Full Tick When Paused — определяет, должен ли этот контроллер игрока выполнять полный цикл обновления (Tick) во время паузы в игре, если функция тика разрешает это.
    • True: при паузе будет выполняться полный тик, как если бы игра не была на паузе.
    • False: во время паузы будет выполняться только минимальное обновление (минимальный тик), а не полный цикл обработки логики.

Mouse Interface

Свойства категории Mouse Interface во вкладке Details
Свойства категории Mouse Interface во вкладке Details
  • Show Mouse Cursor — определяет, должен ли отображаться курсор мыши. Если это свойство установлено в значение True, курсор мыши будет видим на экране для данного контроллера игрока.
  • Enable Click Events — определяет, должны ли генерироваться события клика по Акторам или компонентам. Если это свойство установлено в значение True, при клике мышью будут создаваться события, связанные с нажатием на объекты в игровом мире, такие как On Clicked / On Released для Акторов и компонентов.
  • Enable Touch Events — определяет, должны ли генерироваться события касания (Touch Events) для Акторов и компонентов. Если это свойство установлено в значение True, при взаимодействии с сенсорным экраном (например, на мобильных устройствах) будут создаваться события касания (On Input Touch) для объектов в игровом мире.
  • Enable Mouse Over Events — определяет, должны ли генерироваться события наведения курсора мыши на Акторов или компоненты. Если это свойство установлено в значение True, при наведении курсора мыши на объекты в игровом мире для Акторов и компонентов будут создаваться соответствующие события (например, On Begin Cursor Over и On End Cursor Over).
  • Enable Touch Over Events — определяет, должны ли генерироваться события наведения сенсорного ввода (Touch Over) на Акторов или компоненты. Если это свойство установлено в значение True, при наведении пальца (или другого сенсорного взаимодействия) на объекты в игровом мире будут создаваться соответствующие события для Акторов и компонентов.
  • Click Event Keys — содержит список клавиш, нажатие которых будет инициировать генерацию событий клика (Click Events). По умолчанию в этот список добавлена левая кнопка мыши (Left Mouse Button). Если свойство Enable Click Events установлено в значение True, любые клавиши из этого списка будут вызывать события клика по Акторам или компонентам в игровом мире.
  • Default Mouse Cursor — определяет тип курсора мыши, который будет отображаться по умолчанию для данного контроллера игрока.
    • None: курсор не отображается вообще.
    • Default: стандартный курсор (обычно стрелка).
    • Text Edit Beam: курсор для редактирования текста (вертикальная палочка, как при наборе текста).
    • Resize Left Right: курсор для горизонтального изменения размера (двунаправленная стрелка влево-вправо).
    • Resize Up Down: курсор для вертикального изменения размера (двунаправленная стрелка вверх-вниз).
    • Resize South East: курсор для изменения размера по диагонали.
    • Resize South West: курсор для изменения размера по другой диагонали.
    • Cardinal Cross: курсор для перемещения объектов (крест с четырьмя стрелками).
    • Crosshairs: курсор в виде перекрестия (например, для прицеливания).
    • Hand: курсор в виде руки (обычно для ссылок или перетаскивания).
    • Grab Hand: курсор «рука, готовая схватить» (открытая ладонь).
    • Grab Hand Closed: курсор «рука, схватившая объект» (сжатая ладонь).
    • Slashed Circle: курсор в виде перечёркнутого круга (обычно означает «нельзя здесь действовать»).
    • Eye Dropper: курсор пипетки (для выбора цвета).
  • Default Click Trace Channel — определяет, какой канал трассировки (Trace Channel) будет использоваться по умолчанию для определения, по какому объекту в мире был произведён клик мышью или касание. Когда игрок кликает мышью (или взаимодействует иным способом), движок отправляет невидимый луч (Trace) из положения курсора в игровом мире. Этот луч проверяет пересечения с объектами, и канал трассировки определяет, какие типы объектов будут учитываться при этом. Для выбора предлагаются стандартные каналы трассировки (World Static, World Dynamic, Pawn, Visibility, Camera, Physics Body, Vehicle, Destructible).
  • Trace Distance — определяет максимальную дистанцию, на которую будет производиться трассировка (Trace) из позиции курсора мыши или точки касания при вычислении событий клика (Click Events). Когда игрок кликает мышью или касается экрана, движок отправляет невидимый луч (Trace) от камеры через курсор в игровом мире. Этот луч проверяет, пересекает ли он какие-либо объекты, чтобы определить, по какому объекту был произведён клик. Значение данного свойства ограничивает максимальную длину этого луча: объекты, находящиеся дальше указанной дистанции, не будут обнаружены при клике.

Game

Свойства категории Game во вкладке Details
Свойства категории Game во вкладке Details
  • Force Feedback Enabled — определяет, включена ли поддержка эффектов обратной отдачи (Force Feedback) для данного игрока.

Force Feedback — это вибрация или другие тактильные эффекты, которые могут воспроизводиться на геймпадах, контроллерах или других устройствах с поддержкой обратной связи.

World Partition

Свойства категории World Partition во вкладке Details
Свойства категории World Partition во вкладке Details

* World Partition — это система Unreal Engine, которая автоматически делит большой игровой мир на управляемые сегменты и подгружает их по мере необходимости. Это позволяет создавать огромные открытые миры без перегрузки памяти.

  • Enable Streaming Source — определяет, будет ли этот контроллер игрока использоваться в качестве источника стриминга (Streaming Source) для World Partition. Это означает, что система World Partition будет загружать части мира, ориентируясь на данный Player Controller. Обычно такими источниками служат игроки, камеры или другие ключевые объекты.
  • Streaming Source Should Activate — определяет, должны ли ячейки (Cells) World Partition, подгруженные этим Player Controller как источником стриминга (Streaming Source), автоматически активироваться после загрузки.
  • Streaming Source Should Block On Slow Streaming — определяет, должен ли Player Controller как источник стриминга (Streaming Source) блокировать игровой процесс, если подгрузка (Streaming) ячеек World Partition происходит слишком медленно.
  • Streaming Source Priority — определяет приоритет данного контроллера игрока как источника стриминга (Streaming Source) для системы World Partition. Когда используется World Partition, в мире может быть несколько источников стриминга (например, несколько игроков, камер, специальных объектов). В случае, если несколько источников требуют подгрузки одних и тех же или конфликтующих ячеек мира, система использует приоритеты для определения, какие запросы на подгрузку или выгрузку обрабатывать в первую очередь.
  • Streaming Source Debug Color — определяет цвет, который будет использоваться для визуализации (отладки) этого Player Controller как источника стриминга (Streaming Source) в системе World Partition.
  • Streaming Source Shapes — массив, позволяющий задать индивидуальную (кастомную) форму области стриминга для этого контроллера игрока в системе World Partition.
  • Runtime Grid (свойство наследуется от класса Actor) — имя (Name), определяющее, в какую Partition Grid (сетку сегментирования) попадёт этот Актор при использовании системы World Partition. Если выбрать None, сетка будет выбрана автоматически системой разбиения.
  • Is Spatially Loaded (свойство наследуется от класса Actor) — определяет, будет ли Актор загружаться (Streaming) в Partitioned World (мире с World Partition) на основе своего положения в пространстве и наличия активных Data Layers.
    • True: Актор будет подгружаться только тогда, когда находится в радиусе действия стриминговых источников (например, камеры игрока) и если его Data Layer активен или не задан. Это помогает оптимизировать загрузку объектов и экономить ресурсы, подгружая только то, что реально нужно игроку в данный момент.
    • False: Актор будет загружаться всегда при активном Data Layer, независимо от своей позиции и стриминговых источников. Такой режим полезен для глобальных объектов, логических контроллеров или триггеров, которые должны быть всегда доступны при активном слое данных, даже если игрок далеко.

Controller

Свойства категории Controller во вкладке Details
Свойства категории Controller во вкладке Details
  • Attach to Pawn (свойство наследуется от класса Controller) — определяет, будет ли позиция (Location) Player Controller автоматически совпадать с позицией управляемого Pawn. Более подробно о поведении этого свойства можно узнать в статье, посвящённой разбору класса Controller: Attach To Pawn в классе Controller.

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

Event (Blueprint-события)

* Наследуются от класса Controller.

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

Input Rotation (управление вращением ввода)

Функции управления вращением ввода (Input Rotation)
Функции управления вращением ввода (Input Rotation)
  • Add Pitch Input — добавляет входные данные для вертикального вращения камеры/объекта (Pitch, тангаж). Значение умножается на Input Pitch Scale (коэффициент масштабирования). Используется для управления взглядом вверх/вниз.
  • Add Roll Input — добавляет входные данные для крена камеры/объекта (Roll). Значение умножается на Input Roll Scale (коэффициент масштабирования). Используется для управления наклоном влево/вправо.
  • Add Yaw Input — добавляет входные данные для горизонтального поворота камеры/объекта (Yaw, рысканье). Значение умножается на Input Yaw Scale (коэффициент масштабирования). Используется для управления поворотом влево/вправо.

Input State (состояние ввода)

Функции состояния ввода (Input State)
Функции состояния ввода (Input State)
  • Get Input Analog Key State — возвращает аналоговое значение для указанной клавиши или кнопки (степень нажатия). Если аналоговый ввод не поддерживается, возвращает 1 при нажатии и 0 при отпускании.
  • Get Input Analog Stick State — возвращает значения смещения по осям X и Y для указанного аналогового стика контроллера.
  • Get Input Key Time Down — возвращает, как долго указанная клавиша или кнопка удерживается нажатой. Если клавиша отпущена или только что была нажата в этом кадре, возвращает 0.
  • Get Input Motion State — возвращает состояние Motion-сенсоров устройства ввода (контроллера, геймпада, мобильного устройства): наклон (Tilt), скорость вращения (Rotation Rate), вектор гравитации (Gravity) и ускорение (Acceleration).
  • Get Input Mouse Delta — возвращает изменение позиции курсора мыши: насколько курсор сместился по осям X и Y за текущий кадр.
  • Get Input Touch State — возвращает координаты X и Y на экране для указанного пальца (Finger Index), а также значение (True/False), указывающее, нажата ли эта точка касания в данный момент.
  • Get Input Vector Key State — возвращает векторное значение (Vector) для указанной клавиши или кнопки, например, направление движения аналогового стика геймпада.
  • Is Input Key Down — возвращает значение True, если указанная клавиша или кнопка в данный момент нажата на устройстве ввода, подключённом к этому контроллеру.
  • Was Input Key Just Pressed — возвращает значение True, если указанная клавиша или кнопка была отпущена в предыдущем кадре и нажата в текущем кадре (то есть только что была нажата).
  • Was Input Key Just Released — возвращает значение True, если указанная клавиша или кнопка была нажата в предыдущем кадре и отпущена в текущем кадре (то есть только что была отпущена).

Cursor (курсор и трассировка)

Функции для работы с курсором и трассировкой под ним (Cursor)
Функции для работы с курсором и трассировкой под ним (Cursor)
  • Get Hit Result Under Cursor By Channel — выполняет трассировку (Collision Query) из-под курсора мыши по заданному каналу трассировки (Trace Channel) и возвращает информацию о первом столкновении (Hit Result), если оно произошло.
  • Get Hit Result Under Cursor For Objects — выполняет трассировку (Collision Query) из-под курсора мыши, проверяя пересечения только с объектами указанных типов (Object Types). Возвращает информацию о первом найденном столкновении (Hit Result), если оно произошло.
  • Get Hit Result Under Finger By Channel — выполняет трассировку (Collision Query) из-под заданного пальца на сенсорном экране по указанному каналу трассировки (Trace Channell) и возвращает информацию о первом столкновении (Hit Result, если оно произошло.
  • Get Hit Result Under Finger For Objects — выполняет трассировку (Collision Query) из-под заданного пальца на сенсорном экране, проверяя пересечения только с объектами указанных типов (Object Types). Возвращает информацию о первом найденном столкновении (Hit Result), если оно произошло.
  • Get Mouse Position — возвращает текущие координаты X и Y курсора мыши на экране для данного контроллера игрока.
  • Set Mouse Location — устанавливает позицию курсора мыши на экране (в пикселях) для данного контроллера игрока.
  • Set Mouse Cursor Widget — позволяет назначить пользовательский виджет (User Widget) в качестве визуального отображения для определённого типа курсора мыши у данного контроллера игрока.

Convert Location (преобразование координат)

Функции преобразования систем координат
Функции преобразования систем координат
  • Convert Mouse Location To World Space — преобразует текущую 2D-позицию курсора мыши на экране в 3D-координаты позиции и направления в мировом пространстве (World Space).
  • Convert Screen Location To World Space — преобразует 2D-координаты на экране (ScreenX, ScreenY) в 3D-позицию и направление в мировом пространстве (World Space).
  • Convert World Location To Screen Location — преобразует 3D-координату в мировом пространстве (World Location) в 2D-координату на экране (Screen Location).

Mobile Input (мобильный ввод)

Функции настройки мобильного ввода
Функции настройки мобильного ввода
  • Set Virtual Joystick Visibility — устанавливает видимость виртуального джойстика (виртуального стика) для текущего игрока.
  • Activate Touch Interface — активирует новый интерфейс сенсорного управления (Touch Interface) для данного контроллера игрока.

Audio (параметры звука)

Функции управления параметрами звука
Функции управления параметрами звука
  • Clear Audio Listener Attenuation Override — сбрасывает (отменяет) все ранее установленные переопределения (Override) параметров затухания (Attenuation) для аудиоплеера этого контроллера игрока.
  • Clear Audio Listener Override — сбрасывает любые переопределения (Override), которые были установлены для аудиоплеера этого контроллера игрока.
  • Set Audio Listener Attenuation Override — устанавливает переопределённое (Override) положение затухания (Attenuation) для аудиоплеера данного контроллера игрока.
  • Set Audio Listener Override — переопределяет (Override) стандартное положение и ориентацию аудиоплеера для данного контроллера игрока.

Feedback: Camera (обратная связь камеры)

Функции управления визуальными эффектами камеры для обратной связи игроку
Функции управления визуальными эффектами камеры для обратной связи игроку
  • Client Clear Camera Lens Effects — удаляет все эффекты линзы камеры (Camera Lens Effects) для клиента, к которому привязан этот контроллер игрока.
  • Client Spawn Generic Camera Lens Effect — спавнит (создаёт и отображает) эффект линзы камеры (Camera Lens Effect) на клиенте для данного контроллера игрока. Примером такого эффекта может быть кровь, блики, капли воды, размытие и т.п.
  • Client Start Camera Shake — запускает анимацию тряски камеры (Camera Shake) на клиенте для данного контроллера игрока. Используется для создания эффекта вибрации/тряски камеры, например, при взрывах, выстрелах, получении урона и других событиях.
  • Client Start Camera Shake From Source — запускает анимацию тряски камеры (Camera Shake) на клиенте для данного контроллера игрока, где источник тряски задаётся компонентом-источником (Camera Shake Source Component). Это позволяет сделать тряску камеры локализованной — интенсивность и эффект зависят от расстояния и положения относительно источника.
  • Client Stop Camera Shake — останавливает анимацию тряски камеры (Camera Shake) на клиенте для данного контроллера игрока.
  • Client Stop Camera Shakes From Source — останавливает все эффекты тряски камеры (Camera Shake) на клиенте для данного контроллера игрока, которые были запущены от указанного источника (Camera Shake Source Component).

Feedback (обратная связь контроллеров)

Функции настройки обратной связи (тактильная отдача и световые эффекты контроллера)
Функции настройки обратной связи (тактильная отдача и световые эффекты контроллера)
  • Client Stop Force Feedback — останавливает воспроизведение паттерна виброотклика (Force Feedback) на клиенте для данного контроллера игрока. Позволяет прекратить действие определённого эффекта виброотклика или только эффекта с определённым тегом.
  • Client Play Force Feedback — воспроизводит паттерн виброотклика (Force Feedback) на геймпаде или другом поддерживаемом устройстве для данного Player Controller.
  • Play Dynamic Force Feedback — позволяет управлять динамическим виброоткликом (Dynamic Force Feedback) на геймпаде или другом поддерживаемом устройстве для данного контроллера игрока. Поддерживает латентные действия: можно запускать, обновлять и останавливать эффект, а также отслеживать его завершение.
  • Play Haptic Effect — воспроизводит график тактильной отдачи (Haptic Feedback Curve) на контроллере игрока. Позволяет указать, на какой руке (или устройстве) проигрывать эффект, с каким масштабом интенсивности и нужно ли зациклить эффект.
  • Reset Controller Light Color — сбрасывает цвет подсветки (Light Color) игрового контроллера игрока (например, DualShock, DualSense с RGBподсветкой) на значение по умолчанию, заданное системой или платформой.
  • Set Controller Light Color — устанавливает цвет подсветки (Light Color) на игровом контроллере игрока (например, на DualShock, DualSense с RGBподсветкой).
  • Set Disable Haptics — позволяет включать или отключать все запросы на тактильную отдачу (Haptics) для контроллера игрока. Это полезно, например, при загрузке уровня или в других случаях, когда необходимо временно прекратить любые вибрации и тактильные эффекты.
  • Set Haptics By Value — позволяет напрямую задать параметры тактильной отдачи (Haptics) для указанной руки на контроллере игрока, используя значения частоты и амплитуды.
  • Stop Haptic Effect — останавливает воспроизведение тактильной отдачи (Haptic Feedback) на контроллере игрока для указанной руки.

HUD

Функции для управления HUD
Функции для управления HUD
  • Client Set HUD — устанавливает новый класс HUD (Head-Up Display, интерфейс пользователя) для клиента и создаёт новый экземпляр этого HUD. Если у клиента уже был активный HUD, он уничтожается.
  • Get HUD — возвращает указатель (ссылку) на текущий HUD, используемый этим Player Controller.

Deprecated Input (устаревшие настройки ввода)

Функции для получения и установки устаревших (Deprecated) коэффициентов чувствительности вращения по осям Pitch, Roll и Yaw для обратной совместимости со старыми системами управления
Функции для получения и установки устаревших (Deprecated) коэффициентов чувствительности вращения по осям Pitch, Roll и Yaw для обратной совместимости со старыми системами управления
  • Get Deprecated Input Pitch Scale — предоставляет доступ к устаревшему свойству Input Pitch Scale контроллера игрока, которое определяет множитель чувствительности для изменения угла наклона (Pitch) камеры или персонажа при обработке пользовательского ввода. Используется только если в настройках проекта (InputSettings::EnableLegacyInputScales) включён режим поддержки устаревших масштабов ввода.
  • Get Deprecated Input Roll Scale — предоставляет доступ к устаревшему свойству Input Roll Scale контроллера игрока, которое определяет множитель чувствительности для изменения угла крена (Roll) камеры или персонажа при обработке пользовательского ввода. Используется только если в настройках проекта (InputSettings::EnableLegacyInputScales) включён режим поддержки устаревших масштабов ввода.
  • Get Deprecated Input Yaw Scale — предоставляет доступ к устаревшему свойству Input Yaw Scale контроллера игрока, которое определяет множитель чувствительности изменения угла поворота (Yaw) камеры или персонажа при обработке пользовательского ввода. Используется только если в настройках проекта (InputSettings::EnableLegacyInputScales) включён режим поддержки устаревших масштабов ввода.
  • Set Deprecated Input Pitch Scale — устанавливает значение устаревшего свойства Input Pitch Scale у контроллера игрока, которое определяет множитель чувствительности для изменения угла наклона (Pitch) камеры или персонажа при обработке пользовательского ввода. Используется только если в настройках проекта (InputSettings::EnableLegacyInputScales) включён режим поддержки устаревших масштабов ввода.
  • Set Deprecated Input Roll Scale — устанавливает значение устаревшего свойства Input Roll Scal у контроллера игрока, которое определяет множитель чувствительности для изменения угла крена (Roll) камеры или персонажа при обработке пользовательского ввода. Используется только если в настройках проекта (InputSettings::EnableLegacyInputScales) включён режим поддержки устаревших масштабов ввода.
  • Set Deprecated Input Yaw Scale — устанавливает значение устаревшего свойства Input Yaw Scale у контроллера игрока, которое определяет множитель чувствительности изменения угла поворота (Yaw) камеры или персонажа при обработке пользовательского ввода. Используется только если в настройках проекта (InputSettings::EnableLegacyInputScales) включён режим поддержки устаревших масштабов ввода.

Streaming Source (настройка источника стриминга)

Функции настройки источника стриминга для World Partition
Функции настройки источника стриминга для World Partition
  • Get Streaming Source Location And Rotation — возвращает позицию и поворот объекта, который используется как источник стриминга уровней (Streaming Source) для World Partition.
  • Get Streaming Source Priority — возвращает приоритет источника стриминга (Streaming Source Priority) для данного Player Controller.
  • Get Streaming Source Shapes — возвращает массив форм (Shapes), которые используются этим Player Controller как источники стриминга для World Partition.
  • Is Streaming Source Enabled — возвращает значение True, если данный Player Controller используется как источник стриминга (Streaming Source) для World Partition.
  • Streaming Source Should Activate — определяет, должен ли данный Player Controller, выступающий как источник стриминга (Streaming Source), автоматически активировать ячейки (Cells) World Partition после их подгрузки.
  • Streaming Source Should Block On Slow Streaming — определяет, должен ли данный Player Controller, выступающий как источник стриминга (Streaming Source), блокировать выполнение (например, загрузку уровня или активацию ячеек) в случае медленного стриминга данных из World Partition.

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

Другие функции
Другие функции
  • Get Platform User Id — возвращает уникальный идентификатор пользователя платформы (Platform User Id), который ассоциирован с локальным игроком (Local Player) данного Player Controller.
  • Can Restart Player — возвращает значение True, если Player Controller считает, что может быть перезапущен (например, игрок может снова появиться на карте).
  • Set View Target With Blend — плавно переключает камеру между разными целями просмотра (View Targets) с помощью настраиваемого блендинга (перехода).
  • Get Viewport Size — возвращает размеры (ширину и высоту) области просмотра (Viewport) для текущего Player Controller. Полезно для размещения элементов интерфейса (HUD, UMG, Canvas) с учётом разрешения экрана и других особенностей.
  • Set Cinematic Mode — позволяет серверу или одиночной игре (Single Player) перевести Player Controller (и его Pawn) в кинематографический режим.
  • Get Override Player Input Class — возвращает класс Player Input, который будет использоваться этим Player Controller вместо стандартного класса Player Input для обработки пользовательского ввода.
  • Get Focal Location — возвращает текущую «фокусную» позицию, на которую ориентирован данный Player Controller. Это может быть позиция управляемого Pawn, Spectator Pawn или последняя известная позиция Pawn (обычно место возрождения или смерти).
  • Get Spectator Pawn — возвращает указатель (ссылку) на Pawn, который используется этим Player Controller для режима наблюдателя (Spectator).

Функции Possess и Un Possess

Чтобы произвести в Unreal Engine смену персонажа у Player Controller через код Blueprint, используются функции Possess и Un Possess, наследуемые от родительского класса Controller.

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

Рассмотрим смену персонажа у контроллера игрока с помощью функции Possess на практике.

Практика в Unreal Engine №1. Смена персонажа у PlayerController через Blueprint

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

Ниже представлен Blueprint-код, в котором при помощи функции Possess мы у PlayerController меняем управляемых персонажей. Сами персонажи представлены в игровом мире двумя объектами одного и того же класса BP_ThirdPersonCharacter.

При нажатии на клавишу C в Event Graph контроллера игрока происходит следующий процесс:

  1. Получение текущего персонажа: сначала с помощью ноды функции Get Player Character определяется текущий персонаж (Character), которым управляет PlayerController.
  2. Приведение типа: далее текущее значение через Cast приводится к пользовательскому классу BP_ThirdPersonCharacter.
  3. Формирование списка доступных персонажей: с помощью функции Get All Actors of Class формируется массив всех объектов BP_ThirdPersonCharacter, присутствующих на уровне.
  4. Удаление текущего персонажа из массива: текущий Pawn функцией Remove удаляется из полученного массива, чтобы исключить повторное владение уже используемым объектом.
  5. Смена управляемого персонажа: после этого выбирается первый элемент массива (индекс 0), и с помощью функции Possess контроллер игрока начинает управлять новым персонажем.

Скриншот

Практика в Unreal Engine №1. Смена персонажа у PlayerController через Blueprint при помощи функции Possess
Практика в Unreal Engine №1. Смена персонажа у PlayerController через Blueprint при помощи функции Possess

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


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

Практика в Unreal Engine №2. Переопределение событий «On Possess» и «On UnPossess» в классе PlayerController

Данный практический пример является логическим продолжением 1 примера, который описывался в разделе выше.

Задача: при смене игроком первого персонажа на второго в его интерфейсе (HUD) должен появиться виджет с надписью «Второй игрок». Когда игрок возвращается к первому персонажу, этот виджет нужно удалить.

Первым шагом будет создание самого виджета с надписью «Второй игрок». Для этого создадим виджет WB_HUD, в который добавим нужную надпись. Здесь не будем подробно описывать данный процесс, чтобы не отвлекаться от основной темы.

Согласно условиям задачи, нам необходимо отображать виджет с надписью только у второго персонажа. Чтобы каким-либо образом выделить этого персонажа, присвоим ему тег «2» в разделе Actor настроек Details.

Присвоим второму персонажу тег 2 в разделе Actor настроек Details.
Присвоим второму персонажу тег 2 в разделе Actor настроек Details.

Далее весь код будем размещать в Event Graph класса Player Controller.

Первым действием, при срабатывании события Event Begin Play, создадим в оперативной памяти объект нового виджета. Для этого используем ноду Create Widget, в настройках которой укажем класс нашего виджета — WB_HUD. Затем сохраним ссылку на созданный объект виджета в переменной WB_HUD, чтобы в дальнейшем иметь к нему быстрый доступ и управлять его отображением при необходимости.

Скриншот

Создаём объект виджет в оперативной памяти
Создаём объект виджет в оперативной памяти

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Далее переопределим событие Event On Possess. Напомним, это событие автоматически вызывается, когда PlayerController получает управление над новым Pawn. Именно такой механизм нам и нужен: при переключении между персонажами будет срабатывать вызов этого события. При этом Event On Possess передаёт в качестве параметра объект нового контролируемого Pawn.

Внутри обработчика события первым делом проверим, содержит ли полученный Pawn тег «2». Для этого используем функцию Actor Has Tag. Если у Pawn действительно есть такой тег, с помощью ноды Add to Viewport добавим на экран игрока нужный виджет. В качестве входного параметра укажем ранее созданную переменную, содержащую объект виджета WB_HUD с надписью «Второй игрок».

Скриншот

Переопределяем событие «Event On Possess»
Переопределяем событие «Event On Possess»

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Теперь, когда мы реализовали отображение виджета с текстом при переходе ко второму персонажу, необходимо предусмотреть удаление этого виджета, когда пользователь снова возвращается к первому персонажу.

Для этого переопределим событие Event On UnPossess, которое срабатывает в момент, когда PlayerController теряет контроль над Pawn. Внутри этого события нам потребуется удалить с экрана ранее созданный виджет. Для этого воспользуемся нодой Remove from Parent, которая удалит указанный виджет из иерархии UI. В качестве входного параметра для этой ноды передадим объект виджета, хранящийся в переменной WB_HUD.

Однако стоит учитывать, что Event On UnPossess может вызываться и для персонажей, у которых переменная WB_HUD пуста (например, у первого персонажа). Чтобы избежать ошибок, используем ноду Validated Get для проверки, содержит ли переменная допустимый объект виджета.

Для этого щёлкнем правой кнопкой мыши по переменной WB_HUD и выберем пункт Convert to Validated Get. После этого переменная будет отображаться как нода с двумя выходами: Is Valid (если объект существует) и Is Not Valid (если переменная пуста). Соединяем ноду Remove from Parent с выходом Is Valid — это обеспечит корректное удаление виджета только в случае, если он был создан ранее.

Таким образом, при потере контроля над Pawn с тегом «2» виджет автоматически исчезнет с экрана, а появится вновь только при переходе ко второму персонажу.

Скриншот

Практика в Unreal Engine №2. Переопределение событий «On Possess» и «On UnPossess» в Player Controller
Практика в Unreal Engine №2. Переопределение событий «On Possess» и «On UnPossess» в Player Controller

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Итак, воспользовавшись переопределением событий On Possess и On UnPossess в Player Controller, мы встроили в них свой код и тем самым при переходе с одного персонажа на другой создали новую собственную функциональность.

Практика в Unreal Engine №3. Ограничиваем Pitch камеры у игрока. Player Camera Manager

По умолчанию в Анрил Энджин угол обзора у камеры персонажа настроен довольно-таки широко — на 180 градусов (от -90 до 90). Что не всегда правильно. Ведь камера спускается прям под ноги персонажа…

Задача: ограничить Pitch камеры у Player Controller.

Чтобы ограничить движение Pitch камеры в игре, нужно обратиться к объекту класса менеджера камеры внутри контроллера игрока. В этом классе следует задать параметры минимального и максимального угла поворота камеры.

Сделать это можно через унаследованную переменную Player Camera Manager, в Event Graph класса Player Controller. Эта переменная возвратит текущий объект менеджера камеры. Затем, используя методы Set View Pitch Min и Set View Pitch Max, нужно задать необходимые значения: для минимума — «-75», а для максимума — «55».

Весь этот процесс ставим на выполнение в событии Event BeginPlay, чтобы настройка ограничения Pitch камеры совершилась один раз при старте игры.

Скриншот

Практика в Unreal Engine №3. Ограничиваем Pitch камеры у PlayerController. Player Camera Manager
Практика в Unreal Engine №3. Ограничиваем Pitch камеры у PlayerController. Player Camera Manager

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


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


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

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

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