Мобильное управление в Unreal Engine 5: Джойстик и Прыжок

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

1. Настройка проекта и создание ассета Touch Interface

Настройка проекта и создание ассета Touch Interface

Добро пожаловать на курс «Мобильное управление в Unreal Engine 5: Джойстик и Прыжок». Это первая статья, в которой мы заложим фундамент для создания удобного управления под мобильные платформы. Наша цель — реализовать классическую схему: виртуальный джойстик для перемещения персонажа слева и кнопка прыжка справа.

Многие новички пытаются сразу создавать сложные виджеты через UMG (Unreal Motion Graphics) и писать много логики в Blueprints. Однако Unreal Engine 5 предоставляет мощный встроенный инструмент — Touch Interface Setup, который позволяет настроить базовое управление за считанные минуты, вообще не прибегая к программированию на начальном этапе. Именно с него мы и начнем.

Подготовка проекта

Прежде чем создавать управление, нам нужно правильно настроить проект. Unreal Engine 5 — мощный движок, и по умолчанию он настроен на максимальную графику для ПК и консолей. Для мобильных устройств нам нужно оптимизировать настройки.

Создание проекта

  • Запустите Unreal Engine 5.
  • Перейдите в раздел Games и выберите шаблон Third Person (Третье лицо). Это идеальный старт, так как там уже есть настроенный персонаж и логика движения.
  • В правой части окна настройки проекта выберите следующие параметры:
  • * Blueprint (мы не будем использовать C++ в этом курсе). Target Platform: Mobile*. Quality Preset: Scalable*. * Starter Content: Можно отключить, чтобы сэкономить место.
  • Назовите проект, например, MobileControlCourse, и нажмите Create.
  • Выбор платформы Mobile автоматически переключит рендеринг и настройки ввода в режим, оптимизированный для сенсорных экранов.

    Настройка эмуляции касаний

    Чтобы тестировать мобильное управление прямо на компьютере без постоянной сборки проекта на телефон, нам нужно включить эмуляцию касаний мышью.

  • В редакторе перейдите в Edit -> Project Settings.
  • В строке поиска введите Mouse for Touch.
  • Установите галочку напротив Use Mouse for Touch.
  • Теперь, когда вы запустите игру в редакторе, клик левой кнопкой мыши будет восприниматься движком как касание пальцем экрана.

    Понимание Touch Interface

    В Unreal Engine существует специальный тип ассета — Touch Interface Setup. Это конфигурационный файл, который говорит движку: «Нарисуй вот эту картинку здесь, и если игрок нажмет на неё, считай, что он нажал кнопку на геймпаде».

    Это ключевой момент: Touch Interface эмулирует геймпад.

    Современный шаблон Third Person в UE5 использует систему Enhanced Input. Она уже настроена на прием сигналов от клавиатуры (WASD) и геймпада (левый стик). Если мы настроим наш сенсорный джойстик так, чтобы он выдавал сигнал «Левый стик геймпада», персонаж начнет двигаться автоматически, без написания дополнительного кода.

    !Схема работы Touch Interface: экранные элементы преобразуются в сигналы геймпада.

    Создание ассета управления

    Давайте создадим наш интерфейс.

  • В Content Browser (внизу экрана) кликните правой кнопкой мыши в свободном месте.
  • Перейдите в категорию User Interface.
  • Выберите Touch Interface Setup.
  • Назовите новый ассет TI_MobileControls.
  • Двойным кликом откройте созданный файл. Вы увидите панель настроек, где главным элементом является массив Controls. Именно здесь мы добавим наши элементы управления.

    Настройка виртуального джойстика

    Нам нужно добавить первый элемент — стик для ходьбы. В массиве Controls нажмите на значок + (Add Element), чтобы создать первый элемент (Index [0]). Разверните его настройки.

    Визуальная часть

    Вам понадобятся текстуры для джойстика. Обычно это «фон» (круг) и «палец» (точка, которая двигается). В стандартном контенте движка уже есть текстуры VirtualJoystick_Background и VirtualJoystick_Thumb, используйте их для начала.

    * Image: Выберите VirtualJoystick_Background. Background: Выберите VirtualJoystick_Thumb (да, названия параметров могут сбивать с толку, но Image — это то, что двигается, а Background* — это подложка).

    Позиционирование

    Координаты в Touch Interface задаются относительно центра экрана или углов. Центр экрана — это .

    * Center: Задайте значения и . Это разместит джойстик в левой нижней части экрана. * Visual Size: Задайте размер, например, и (в пикселях). * Thumb Size: Размер подвижной части, например, и . * Interaction Size: Это зона, в которой джойстик реагирует на касание. Сделайте её больше визуального размера, например, и , чтобы игроку было легче попасть по нему.

    Привязка к вводу (Input)

    Самое важное поле — Main Input Key.

    * Выберите Gamepad Left Thumbstick 2D.

    Это скажет движку, что движение этого сенсорного элемента равносильно отклонению левого стика на физическом геймпаде.

    Настройка кнопки прыжка

    Теперь добавим кнопку прыжка. В массиве Controls снова нажмите +, чтобы добавить второй элемент (Index [1]).

    Визуальная часть

    Для кнопки прыжка нам нужна просто иконка. Вы можете использовать ту же текстуру круга или импортировать свою.

    * Image: Выберите текстуру для кнопки (например, VirtualJoystick_Thumb для простоты). * Background: Оставьте пустым, если хотите просто кнопку без подложки.

    Позиционирование

    Кнопка должна быть справа.

    * Center: Задайте и . Это правая нижняя часть экрана. * Visual Size: , . * Interaction Size: , .

    Привязка к вводу

    Здесь есть нюанс. Джойстик выдает значения осей (от -1 до 1), а кнопка — просто нажатие.

    * Main Input Key: Выберите Gamepad Face Button Bottom.

    Почему именно эта клавиша? В стандартной раскладке геймпадов (Xbox/PlayStation) нижняя кнопка (A или X) обычно отвечает за прыжок. Шаблон Third Person уже настроен так, что действие Jump срабатывает от этой кнопки.

    !Настройка параметров элемента управления в ассете Touch Interface.

    Активация интерфейса в проекте

    Мы создали ассет, но движок еще не знает, что его нужно использовать.

  • Откройте Project Settings.
  • Перейдите в раздел Engine -> Input.
  • Найдите категорию Mobile.
  • В поле Default Touch Interface выберите ваш созданный ассет TI_MobileControls.
  • Тестирование

    Теперь самое интересное. Закройте настройки и нажмите кнопку Play (лучше выбрать режим Mobile Preview ES3.1 через три точки рядом с кнопкой Play, но и обычный Selected Viewport подойдет, если вы включили эмуляцию мыши).

    Вы должны увидеть два круга на экране:

  • Слева: При нажатии и перетаскивании мышью (или пальцем) персонаж должен начать бежать.
  • Справа: При клике персонаж должен прыгать.
  • Если персонаж бежит, но не прыгает, или наоборот — проверьте настройки Main Input Key в вашем ассете TI_MobileControls.

    Итог

    Мы успешно создали базовое сенсорное управление, не написав ни строчки кода. Мы использовали Touch Interface Setup, чтобы транслировать касания экрана в команды геймпада, которые уже понятны стандартному контроллеру персонажа.

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

    2. Конфигурация виртуального джойстика для ходьбы и кнопки для прыжка

    Конфигурация виртуального джойстика для ходьбы и кнопки для прыжка

    Добро пожаловать во вторую часть нашего курса «Мобильное управление в Unreal Engine 5: Джойстик и Прыжок». В предыдущей статье мы подготовили проект, включили эмуляцию касаний мышью и создали пустой ассет Touch Interface Setup. Теперь пришло время наполнить его жизнью.

    Наша задача на сегодня — настроить два конкретных элемента управления: виртуальный стик слева для перемещения персонажа и кнопку справа для прыжка. Мы разберем каждый параметр настройки, чтобы вы понимали не только как это сделать, но и почему это работает именно так.

    Логика работы Touch Interface

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

    Система координат

    В отличие от пиксельных координат (например, ), Touch Interface использует относительные координаты от до . Это гарантирует, что ваше управление будет оставаться на своих местах независимо от того, запустите ли вы игру на маленьком iPhone или на огромном планшете Android.

    Координаты задаются парой чисел :

    Где — точка на экране, — положение по горизонтали, а — положение по вертикали.

    * Левый верхний угол экрана имеет координаты . * Правый нижний угол экрана имеет координаты . * Центр экрана — это .

    !Схема координатной сетки Touch Interface, показывающая расположение элементов управления относительно границ экрана.

    Понимание этой сетки критически важно для позиционирования элементов. Если вы укажете , кнопка улетит за правую границу экрана.

    Настройка левого джойстика (Movement)

    Откройте ваш ассет TI_MobileControls, который мы создали ранее. Найдите массив Controls и разверните элемент с индексом 0 (если его нет, добавьте нажатием на +). Этот элемент будет отвечать за ходьбу.

    Визуальные компоненты (Image и Background)

    Виртуальный джойстик состоит из двух текстур:

  • Image: Это подвижная часть («шляпка» стика), которая следует за пальцем игрока.
  • Background: Это неподвижная основа, которая показывает границы джойстика.
  • В стандартном контенте движка (если вы включили Engine Content в браузере ассетов) есть готовые текстуры. Назначьте их следующим образом:

    * Image: VirtualJoystick_Thumb * Background: VirtualJoystick_Background

    Позиционирование (Center)

    Нам нужно разместить джойстик под большим пальцем левой руки. Эргономически удобная зона находится в левой нижней четверти экрана.

    Установите параметр Center: * *

    Это означает, что центр джойстика будет находиться на 15% ширины экрана от левого края и на 75% высоты экрана от верхнего края.

    Размеры (Visual Size и Thumb Size)

    Здесь мы задаем размеры в условных единицах (обычно соответствующих пикселям на эталонном разрешении, которое движок масштабирует).

    * Visual Size: Установите , . Это размер фонового круга. * Thumb Size: Установите , . Это размер подвижной части.

    Зона взаимодействия (Interaction Size)

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

    * Interaction Size: Установите , .

    Если палец игрока коснется экрана в пределах этой невидимой зоны вокруг центра джойстика, управление активируется.

    Привязка ввода (Input Mapping)

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

    Найдите параметр Main Input Key и выберите: * Gamepad Left Thumbstick 2D

    Эта настройка автоматически транслирует смещение пальца по горизонтали в ось Gamepad Left Thumbstick X-Axis, а по вертикали — в Gamepad Left Thumbstick Y-Axis. Поскольку стандартный шаблон Third Person уже настроен на работу с этими осями, ваш персонаж начнет двигаться сразу после запуска.

    Настройка кнопки прыжка (Jump)

    Теперь добавим кнопку прыжка. В массиве Controls добавьте новый элемент (нажмите +), чтобы появился индекс 1.

    В Unreal Engine Touch Interface технически все элементы являются джойстиками. Кнопка — это просто джойстик, который мы не планируем двигать, или джойстик, который срабатывает как нажатие клавиши.

    Визуализация кнопки

    Для кнопки нам обычно не нужна подложка, только сама иконка, которую нажимают.

    * Image: VirtualJoystick_Thumb (или любая другая иконка кнопки, если вы импортировали свои). * Background: Оставьте пустым (Clear).

    Позиционирование справа

    Кнопка прыжка должна находиться под большим пальцем правой руки. Используем симметрию относительно джойстика движения.

    Установите параметр Center: * (85% от левого края, то есть справа) * (на той же высоте, что и джойстик)

    Размеры

    Кнопка может быть чуть меньше джойстика движения.

    * Visual Size: , . * Thumb Size: , (здесь они равны, так как подвижной части нет). * Interaction Size: , (делаем зону клика больше для надежности).

    Магия превращения джойстика в кнопку

    Как заставить джойстик работать как кнопка Space или кнопка A на геймпаде? Все дело в выборе правильного ключа ввода.

    В параметре Main Input Key выберите: * Gamepad Face Button Bottom

    В терминологии Unreal Engine «Face Button Bottom» соответствует кнопке A на Xbox или X на PlayStation (нижняя кнопка в ромбе кнопок). В стандартном шаблоне Third Person Character действие Jump привязано именно к этой кнопке.

    Когда вы коснетесь этой зоны на экране, движок отправит сигнал «Нажата кнопка A на геймпаде», и персонаж подпрыгнет.

    Тонкая настройка поведения

    Чтобы управление ощущалось профессионально, стоит обратить внимание на пару дополнительных параметров.

    Input Scale

    Для джойстика движения (Index 0) параметр Input Scale должен быть равен . Это означает прямую передачу движения.

    Для кнопки прыжка (Index 1) этот параметр не так важен, так как кнопка бинарна (нажата/не нажата), но лучше оставить его по умолчанию.

    Prevent Recentering

    Этот параметр определяет, должен ли центр джойстика смещаться под палец игрока при первом касании.

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

    Проверка результата

    Теперь, когда оба элемента настроены, сохраните ассет TI_MobileControls.

    Убедитесь, что в Project Settings -> Input -> Mobile -> Default Touch Interface выбран именно этот ассет.

    Запустите игру в редакторе (Play). Если вы включили эмуляцию мыши (как мы делали в прошлой статье), вы сможете:

  • Зажать левую кнопку мыши на левом круге и потянуть — персонаж побежит.
  • Кликнуть левой кнопкой мыши по правому кругу — персонаж подпрыгнет.
  • > Важное замечание: В данной конфигурации мы настроили только движение и прыжок. Мы не настроили вращение камеры. Это означает, что персонаж будет бегать относительно текущего вида камеры, но повернуть саму камеру пальцем пока нельзя. Это нормальное поведение для текущего этапа. Реализация поворота камеры (Touch Look) требует либо добавления невидимой сенсорной зоны, либо использования второго джойстика, что мы рассмотрим в будущих материалах, если потребуется расширение функционала.

    Решение частых проблем

    Если персонаж не двигается:

  • Проверьте, что в Main Input Key левого джойстика выбрано именно Gamepad Left Thumbstick 2D, а не просто Left Thumbstick X.
  • Убедитесь, что в настройках ввода проекта (Enhanced Input) действие Move привязано к Gamepad Left Thumbstick 2D.
  • Если персонаж не прыгает:

  • Проверьте, что кнопка прыжка привязана к Gamepad Face Button Bottom.
  • Убедитесь, что Interaction Size кнопки достаточно велик и не перекрывается другими элементами UI.
  • Теперь у вас есть полностью рабочий прототип мобильного управления для платформера или раннера. В этом уроке мы научились переводить касания экрана в понятные движку сигналы геймпада, используя только встроенные средства Unreal Engine 5.

    3. Настройка системы Enhanced Input: Actions и Mapping Context

    Настройка системы Enhanced Input: Actions и Mapping Context

    Добро пожаловать в третью часть курса «Мобильное управление в Unreal Engine 5: Джойстик и Прыжок». В предыдущих статьях мы создали визуальный интерфейс (Touch Interface), который эмулирует нажатия кнопок геймпада. Теперь нам нужно научить движок правильно интерпретировать эти сигналы.

    В Unreal Engine 5 стандартом для управления является система Enhanced Input. Это гибкая и мощная архитектура, которая заменила устаревшую систему ввода (Legacy Input). Сегодня мы разберем, как связать наши виртуальные джойстики с логикой движения персонажа через Input Actions и Mapping Contexts.

    Архитектура Enhanced Input

    Прежде чем нажимать кнопки, давайте поймем логику. Система Enhanced Input разделяет «что я хочу сделать» и «как я это делаю».

    Она состоит из четырех основных компонентов:

  • Input Action (IA) — это само действие. Например: «Прыжок», «Движение», «Выстрел». Это абстракция, которая не знает, какая кнопка нажата.
  • Input Mapping Context (IMC) — это словарь, который связывает физические кнопки (клавиша пробел, стик геймпада, сенсорная зона) с конкретными Input Actions.
  • Modifiers — модификаторы, которые изменяют сырые данные ввода (например, инвертируют ось или добавляют мертвую зону).
  • Triggers — условия, при которых действие считается сработавшим (например, удержание кнопки или двойное нажатие).
  • !Диаграмма, показывающая путь сигнала от физического устройства через систему маппинга до игровой логики.

    Шаг 1: Создание Input Actions

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

  • В Content Browser кликните правой кнопкой мыши.
  • Перейдите в Input -> Input Action.
  • Назовите первый ассет IA_Jump.
  • Повторите процесс и создайте второй ассет с именем IA_Move.
  • Настройка IA_Jump

    Откройте IA_Jump. Самый важный параметр здесь — Value Type (Тип значения).

    * Для прыжка нам нужно просто знать, нажата кнопка или нет. Это цифровой сигнал (Digital). * Установите Value Type в значение Digital (bool).

    Настройка IA_Move

    Откройте IA_Move. Движение персонажа сложнее прыжка, так как оно имеет направление и скорость.

    Наш виртуальный джойстик выдает координаты по двум осям: и . Следовательно, тип данных должен поддерживать два измерения.

    * Установите Value Type в значение Axis2D (Vector2D).

    Математически это можно представить как вектор:

    Где — это итоговый вектор ввода, — отклонение стика по горизонтали (влево-вправо), а — отклонение по вертикали (вперед-назад).

    Шаг 2: Создание Input Mapping Context (IMC)

    Теперь нам нужно связать эти действия с сигналами, которые отправляет наш Touch Interface.

  • В Content Browser кликните правой кнопкой мыши.
  • Перейдите в Input -> Input Mapping Context.
  • Назовите его IMC_Default.
  • Откройте созданный файл. Вы увидите список Mappings. Нажмите на +, чтобы добавить новые привязки.

    Привязка прыжка (Jump)

  • Выберите в выпадающем списке действие IA_Jump.
  • Раскройте список клавиш под ним.
  • Нам нужно выбрать ту клавишу, которую эмулирует наш сенсорный интерфейс. В прошлой статье мы настроили кнопку прыжка на Gamepad Face Button Bottom.
  • Найдите и выберите Gamepad Face Button Bottom.
  • > Совет: Для удобства тестирования на ПК вы можете добавить сюда же вторую клавишу — Space Bar (Пробел). Система Enhanced Input позволяет привязывать сколько угодно клавиш к одному действию.

    Привязка движения (Move)

  • Добавьте новое действие IA_Move.
  • В качестве клавиши выберите Gamepad Left Thumbstick 2D.
  • Именно эту ось мы указали в настройках Touch Interface для левого джойстика. Теперь, когда вы будете двигать виртуальный стик на экране, он будет передавать значения и в действие IA_Move.

    Добавление мертвой зоны (Deadzone)

    Сенсорные джойстики иногда могут быть слишком чувствительными или не возвращаться идеально в ноль. Для этого используются модификаторы.

  • В строке с Gamepad Left Thumbstick 2D нажмите на стрелку рядом с Modifiers.
  • Добавьте модификатор Dead Zone.
  • Оставьте значения по умолчанию или настройте Lower Threshold на . Это означает, что отклонения стика менее чем на 20% будут игнорироваться, предотвращая случайное движение.
  • Шаг 3: Активация контекста в Blueprint

    Создание ассетов — это только половина дела. По умолчанию персонаж не знает о существовании вашего IMC_Default. Нам нужно явно сказать контроллеру: «Используй этот набор правил».

  • Откройте Blueprint вашего персонажа (обычно это BP_ThirdPersonCharacter).
  • Найдите событие BeginPlay.
  • Нам нужно получить доступ к подсистеме ввода локального игрока. Логика выглядит так:
  • * Получить контроллер (Get Controller). * Привести его к типу Player Controller (Cast to PlayerController). * Из Player Controller получить подсистему (Get Enhanced Input Local Player Subsystem). * Вызвать функцию Add Mapping Context.

    В ноде Add Mapping Context выберите ваш ассет IMC_Default.

    Если вы используете шаблон Third Person, эта логика, скорее всего, уже написана. Вам нужно лишь убедиться, что в ноде Add Mapping Context выбран правильный контекст (или добавить свой, если вы создаете управление с нуля).

    Шаг 4: Обработка событий в Event Graph

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

    Логика прыжка

  • В Event Graph кликните правой кнопкой мыши и найдите IA_Jump (в разделе Enhanced Action Events).
  • У вас появится нода с выходами Started, Triggered, Completed.
  • Соедините выход Started (или Triggered) с функцией Jump.
  • Соедините выход Completed с функцией Stop Jumping.
  • Логика движения

  • Найдите событие IA_Move.
  • У этой ноды есть выход Action Value. Это и есть наш вектор .
  • Кликните правой кнопкой по пину Action Value и выберите Split Struct Pin, чтобы получить отдельные значения и .
  • Для движения персонажа нам нужно знать, куда направлена камера.

  • Используйте функцию Get Control Rotation.
  • Из нее возьмите Get Forward Vector (вектор вперед) и Get Right Vector (вектор вправо).
  • Вызовите функцию Add Movement Input дважды:
  • * Первый раз: соедините Forward Vector с направлением (World Direction), а Action Value Y (ось Y джойстика) с масштабом (Scale Value). * Второй раз: соедините Right Vector с направлением, а Action Value X (ось X джойстика) с масштабом.

    Формула итогового движения будет выглядеть как сумма векторов:

    Где — итоговый вектор движения, — вектор направления «вперед» относительно камеры, — ввод с джойстика по вертикали, — вектор направления «вправо», — ввод с джойстика по горизонтали.

    Итог

    Мы завершили настройку логической части управления. Давайте закрепим цепочку событий:

  • Игрок касается экрана в зоне Touch Interface.
  • Touch Interface генерирует сигнал Gamepad Left Thumbstick.
  • Система Enhanced Input перехватывает этот сигнал.
  • Через Mapping Context сигнал преобразуется в действие IA_Move.
  • В Blueprint срабатывает событие IA_Move, которое двигает персонажа.
  • Теперь ваш мобильный персонаж должен полноценно бегать и прыгать. В следующей части мы займемся полировкой: настройкой камеры и анимаций для более плавного игрового опыта.

    4. Программирование логики движения и прыжка в Blueprint персонажа

    Программирование логики движения и прыжка в Blueprint персонажа

    Добро пожаловать в четвертую часть курса «Мобильное управление в Unreal Engine 5: Джойстик и Прыжок». Мы уже проделали огромную работу: настроили проект, создали визуальный интерфейс (Touch Interface) и сконфигурировали систему ввода Enhanced Input. Теперь у нас есть «глаза» (интерфейс) и «нервы» (Input Actions), но нашему персонажу все еще не хватает «мозга», чтобы понять, как реагировать на эти сигналы.

    В этой статье мы погрузимся в Blueprint — систему визуального скриптинга Unreal Engine. Мы соединим все созданные ранее компоненты воедино, чтобы персонаж начал двигаться и прыгать по команде с сенсорного экрана.

    Подготовка: где мы будем работать?

    Вся логика управления персонажем обычно находится в классе Character Blueprint. Если вы начали проект с шаблона Third Person, этот файл называется BP_ThirdPersonCharacter.

  • Откройте папку ThirdPerson -> Blueprints в Content Browser.
  • Дважды кликните по BP_ThirdPersonCharacter, чтобы открыть редактор.
  • Перейдите во вкладку Event Graph. Это рабочее пространство, где мы будем создавать логические цепочки.
  • Если вы видите там уже существующий код для ввода (Input), не пугайтесь. Мы разберем, как он работает, или создадим его заново, чтобы вы полностью понимали процесс.

    Активация Mapping Context

    Прежде чем обрабатывать нажатия, мы должны убедиться, что наш Input Mapping Context (IMC), созданный в прошлой статье, активирован. Без этого шага движок будет игнорировать любые сигналы ввода.

    Обычно это делается при старте игры. Найдите событие Event BeginPlay.

    Логическая цепочка должна выглядеть следующим образом:

  • Event BeginPlay — точка входа при появлении персонажа.
  • Get Controller — получаем ссылку на контроллер, который управляет этим персонажем.
  • Cast to PlayerController — преобразуем общий контроллер в контроллер игрока (так как только у игрока есть система ввода).
  • Get Enhanced Input Local Player Subsystem — получаем доступ к подсистеме ввода.
  • Add Mapping Context — добавляем наш контекст IMC_Default.
  • Убедитесь, что в ноде Add Mapping Context в поле Mapping Context выбран именно ваш ассет. Если это поле пустое, управление работать не будет.

    Реализация логики движения (Movement)

    Движение — это самая сложная часть базового управления, так как оно требует работы с векторами и системой координат. Наша задача — трансформировать 2D-координаты джойстика (X, Y) в 3D-движение персонажа в мире.

    Событие ввода IA_Move

    Найдите пустое место в Event Graph и кликните правой кнопкой мыши. Введите в поиске IA_Move (или то имя, которое вы дали Action для движения). Выберите Event IA_Move.

    У этой ноды есть важный выходной параметр — Action Value. Так как мы настроили его как Axis2D (Vector2D), он выдает нам пару чисел:

    Где — вектор ввода с джойстика, — отклонение влево/вправо (от -1 до 1), а — отклонение назад/вперед (от -1 до 1).

    Относительность движения

    Если мы просто будем двигать персонажа по мировым осям X и Y, управление будет казаться странным. Когда камера поворачивается, «вперед» для игрока меняется, но мировая ось X остается на месте. Нам нужно двигать персонажа относительно направления камеры.

    Для этого нам понадобятся два вектора:

  • Forward Vector (Вектор Вперед) — куда смотрит камера.
  • Right Vector (Вектор Вправо) — перпендикуляр к взгляду камеры.
  • [VISUALIZATION: Схематичное изображение персонажа вид сверху. Показаны два вектора: синяя стрелка

    5. Подключение интерфейса в Player Controller и тестирование на устройстве

    Подключение интерфейса в Player Controller и тестирование на устройстве

    Добро пожаловать в заключительную статью курса «Мобильное управление в Unreal Engine 5: Джойстик и Прыжок». Мы проделали огромную работу: настроили проект, создали визуальный стиль джойстиков, связали их с системой Enhanced Input и запрограммировали логику движения персонажа.

    Однако, если вы попытаетесь запустить игру прямо сейчас, вы можете столкнуться с рядом проблем: джойстики могут не появиться, управление может конфликтовать с мышью, а на реальном телефоне интерфейс может выглядеть слишком мелким или огромным. В этой статье мы «закрутим последние гайки»: настроим принудительное отображение интерфейса через Player Controller, разберем нюансы тестирования на ПК и, наконец, запустим проект на мобильном устройстве.

    Управление видимостью Touch Interface

    В первой статье мы задали Default Touch Interface в настройках проекта. Это работает для простых игр, но в профессиональной разработке часто требуется больше контроля. Например, когда игрок открывает инвентарь или меню паузы, джойстики должны исчезать, а при возвращении в игру — появляться снова.

    Для этого мы будем использовать Player Controller.

    Принудительная активация через Blueprint

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

  • Откройте Blueprint вашего контроллера (или персонажа, если логика находится там, но лучше использовать Controller). Найдите событие BeginPlay.
  • Добавьте ноду Activate Touch Interface.
  • В поле New Touch Interface выберите ваш ассет TI_MobileControls.
  • Эта нода принудительно включает указанный сенсорный интерфейс. Если вы захотите скрыть его (например, в кат-сцене), вы можете вызвать эту же ноду, оставив поле New Touch Interface пустым (None).

    Проблема «Исчезающих джойстиков» на ПК

    Частая проблема новичков: «Я нажимаю Play в редакторе, но джойстиков нет». Это происходит потому, что Unreal Engine определяет, что к компьютеру подключена мышь и клавиатура, и автоматически скрывает сенсорный интерфейс за ненадобностью.

    Чтобы видеть джойстики на ПК во время тестов, нужно изменить одну настройку:

  • Перейдите в Project Settings -> Engine -> Input.
  • Найдите категорию Mobile.
  • Установите галочку Always Show Touch Interface (Всегда показывать сенсорный интерфейс).
  • Теперь, даже если вы играете с клавиатуры, круги джойстиков будут отрисовываться на экране. Это критически важно для отладки визуальной части.

    Режимы тестирования в редакторе

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

    Эмуляция касаний (Mouse for Touch)

    Мы уже включали эту опцию в первой статье, но давайте вспомним, как она работает. Опция Use Mouse for Touch в настройках ввода позволяет левой кнопке мыши имитировать одно касание (Touch 0).

    Важное ограничение: Мышь имеет только один курсор. Это значит, что на ПК вы не сможете одновременно бежать и прыгать. Вы можете либо тянуть левый стик, либо нажимать кнопку прыжка. Это нормально. Полноценный мультитач (одновременное нажатие нескольких кнопок) можно проверить только на реальном сенсорном устройстве.

    Mobile Preview ES3.1

    Обычный режим Selected Viewport использует мощный рендерер для ПК (SM5/SM6). Он показывает тени, отражения и эффекты, которых может не быть на телефоне. Чтобы увидеть игру «глазами телефона», используйте режим Mobile Preview.

  • Рядом с кнопкой Play на верхней панели нажмите на три точки (Change Play Mode).
  • Выберите Mobile Preview ES3.1 (PIE).
  • Откроется отдельное окно, которое эмулирует графические возможности мобильного устройства (OpenGL ES или Vulkan). Также в этом окне можно менять разрешение и соотношение сторон, чтобы проверить, как интерфейс адаптируется под разные экраны.

    !Диаграмма, отображающая последовательность тестирования от разработки до финального устройства

    Адаптация под разные экраны (DPI Scaling)

    Мобильные устройства имеют огромное разнообразие разрешений: от вытянутых экранов современных смартфонов до почти квадратных планшетов. Наш Touch Interface должен выглядеть одинаково удобно везде.

    Unreal Engine использует систему DPI Scaling (Dots Per Inch), чтобы масштабировать интерфейс. Однако Touch Interface — это не совсем обычный виджет UMG, он работает немного иначе.

    В ассете Touch Interface координаты задаются в нормализованном виде (от 0 до 1), что уже решает проблему позиционирования. Но размер самих кругов (Visual Size) задается в пикселях. Если вы задали размер 200 пикселей, на экране с разрешением 720p это будет выглядеть нормально, а на экране 4K — как крошечная точка.

    Чтобы проверить, как это будет выглядеть, нам нужно понимать коэффициент масштабирования. Формула масштаба интерфейса обычно зависит от высоты или ширины экрана:

    Где — итоговый коэффициент масштаба, — текущее разрешение (например, ширина экрана устройства), а — базовое разрешение, под которое вы разрабатывали игру (обычно 1080 или 1920).

    К счастью, UE5 делает это автоматически, если правильно настроена DPI Curve в настройках User Interface. Но для Touch Interface важно проверить параметр Interaction Size. Убедитесь, что зона взаимодействия достаточно велика, чтобы палец игрока не промахивался на экранах с высокой плотностью пикселей.

    Запуск на реальном устройстве (Launch)

    Момент истины. Давайте перенесем игру на смартфон. Мы рассмотрим пример для Android, так как он наиболее доступен для быстрой отладки, но процесс для iOS схож (требует Mac и сертификатов).

    Подготовка устройства

  • Режим разработчика: На телефоне зайдите в Настройки -> О телефоне и нажмите 7 раз на «Номер сборки».
  • Отладка по USB: В появившемся меню «Для разработчиков» включите «Отладка по USB».
  • Подключите телефон кабелем к ПК.
  • Установка Android SDK

    Unreal Engine 5 требует установленного Android Studio и настроенных путей к SDK/NDK. В папке движка (Engine/Extras/Android) есть скрипт SetupAndroid.bat, который помогает настроить окружение автоматически.

    Quick Launch

    В редакторе UE5:

  • Нажмите на кнопку Platforms (Платформы) на верхней панели.
  • В разделе Devices (Устройства) вы должны увидеть ваш телефон (например, Samsung SM-A505).
  • Если телефона нет, проверьте драйверы и кабель.
  • Выберите ваш телефон в списке Quick Launch.
  • Движок начнет компиляцию шейдеров и сборку APK. Первый запуск может занять 10-20 минут. Последующие будут занимать секунды.

    > «Quick Launch — это не финальная сборка. Это версия для разработки, которая содержит отладочные символы и не оптимизирована по размеру, но она идеально подходит для проверки управления». — Документация Unreal Engine.

    Тестирование мультитача

    Когда игра запустится на телефоне, первым делом проверьте то, что нельзя было проверить на ПК — одновременное использование джойстика и кнопки прыжка.

  • Положите левый палец на виртуальный стик и начните бежать.
  • Не отпуская левый палец, нажмите правым пальцем на кнопку прыжка.
  • Ожидаемое поведение: Персонаж продолжает бежать и подпрыгивает.

    Возможная ошибка: При нажатии прыжка персонаж останавливается.

    Если персонаж останавливается, это значит, что настройки ввода конфликтуют, и касание второго пальца перехватывает фокус у первого. В системе Enhanced Input это обычно решено по умолчанию, так как каждый палец отслеживается как отдельный Touch 1, Touch 2 и т.д., но все они маппятся на действия геймпада.

    Если проблема возникает, проверьте настройки вашего Input Mapping Context. Убедитесь, что действие IA_Move не имеет блокирующих триггеров, которые сбрасываются при появлении нового ввода.

    Финальная полировка

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

    Регулировка чувствительности

    Если персонаж начинает бежать слишком резко или, наоборот, вяло, вернитесь в ассет IA_Move и добавьте или измените модификаторы.

    * Dead Zone (Мертвая зона): Если персонаж дрейфует сам по себе (джойстик не возвращается идеально в ноль), увеличьте порог мертвой зоны (например, с до ). * Scalar (Множитель): Если вы хотите, чтобы персонаж достигал максимальной скорости быстрее, можно использовать кривую отклика (Response Curve).

    Визуальная обратная связь

    Стандартные текстуры Unreal Engine функциональны, но скучны. Теперь, когда механика работает, вы можете заменить изображения в ассете TI_MobileControls на свои собственные спрайты, подходящие под стиль вашей игры.

    Заключение курса

    Поздравляем! Вы прошли путь от пустого проекта до полностью играбельного прототипа с мобильным управлением.

    Мы изучили:

  • Как создавать и настраивать Touch Interface Setup.
  • Как работает координатная сетка мобильного экрана.
  • Как использовать мощь Enhanced Input для связки сенсора и логики.
  • Как программировать движение в Blueprint.
  • Как тестировать результат на реальном железе.
  • Теперь у вас есть надежный фундамент. Вы можете расширять этот интерфейс: добавить кнопку стрельбы, приседания, инвентаря или даже управление камерой свайпами. Принципы останутся теми же: создаем элемент в Touch Interface, привязываем к клавише геймпада, ловим сигнал в Enhanced Input и обрабатываем в Blueprint.

    Удачи в разработке ваших мобильных шедевров на Unreal Engine 5!