Unreal Engine 5 и VR с нуля. Часть 11. Естественный спринт в VR: Управление скоростью с помощью махов рук. Arm Swinging спринт
Введение
В феврале, я проходил курс по С++ для Unreal Engine в контексте VR. В это же время я начал параллельно писать основу для VR проекта с нуля, но в какой то момент, понял насколько много вещей нужно учесть и протестировать, прежде чем двигаться дальше.
Я закомментировал весь написанный код и перешел на VR Expansion Plugin. В этом плагине уже решено множество проблем, как синхронизация камеры HMD и капсулы персонажа, поведение капсулы когда ты движешься физически упираешься в стену и так далее. Я до сих пор разбираю код этого плагина. Плагин поддерживает разные версии Unreal Engine. Всё доступно в репозитории бесплатно: https://github.com/mordentral/VRExpansionPlugin
Я полностью перенес код VR Expansion Plugin в свой проект, чтобы в последующем модифицировать его. Так как я базируюсь на коде этого плагина, я не буду описывать туториалы "как с нуля построить VR проект", вроде бы звучит логичным "покажи как перенести код из VR Expansion Plugin и модифицировать его", но у меня столько времени нет.
Статьи будут выходить, в статьях я буду стараться передавать модульный функционал. Показывая пример как его можно применить на простом примере. Так как контекст всех проектов разный, основываясь на моем примере вы можете применить его у себя (нейронки в помощь, грузите ей "свой контекст" и "мой пример", смотрите как можно интегрировать и надо ли оно вам вобще)
А сегодня поговорим про перевод персонажа в спринт с помощью махов рук. Такая механика применяется например в Blade and Sorcery или Battle Talent.
Функции вероятнее всего будут приложены скриншотами, а скопировать код можно будет из https://gist.github.com/8bitsage
Код этой статьи: https://gist.github.com/8bitsage/0e17f196d2114ec7d663e08a29204c5b
Концепция механики Arm Swinging
Идея проста: когда игрок двигается вперед и активно машет руками (как при беге), персонаж автоматически переходит в режим спринта. Это позволяет:
Освободить кнопки контроллера для других действий.
Сделать передвижение более иммерсивным.
Связать физическую активность игрока со скоростью персонажа в игре.
Архитектура решения
Шаг 1: Определение переменных
В заголовочном файле (h файл) класса персонажа (например, AVRPlayerCharacter.h) добавляем необходимые переменные:
// === Настраиваемые параметры ===
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement|ArmSwing",
meta = (ClampMin = "3.0", ClampMax = "15.0"))
float ArmSwingThreshold = 7.0f;
// Порог активации спринта в сантиметрах
// Определяет минимальное суммарное расстояние, которое должны пройти
// оба контроллера за один цикл проверки для активации спринта
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement|ArmSwing",
meta = (ClampMin = "0.01", ClampMax = "0.2"))
float CheckFrequency = 0.02f;
// Частота проверки движения контроллеров в секундах
// Меньшее значение = более отзывчивая механика, но больше нагрузка
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float SprintSpeed = 600.0f;
// Скорость персонажа при спринте (см/с)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float RunSpeed = 400.0f;
// Скорость персонажа при беге (см/с)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float WalkSpeed = 200.0f;
// Скорость персонажа при ходьбе (см/с)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement",
meta = (ClampMin = "0.1", ClampMax = "0.5"))
float MinStickMagnitudeForRun = 0.3f;
// Минимальное отклонение стика для перехода от ходьбы к бегу
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement",
meta = (ClampMin = "0.5", ClampMax = "0.9"))
float MinForwardRatioForSprint = 0.7f;
// Минимальная доля движения вперед для возможности спринта
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement",
meta = (ClampMin = "0.3", ClampMax = "0.7"))
float MaxLateralRatioForSprint = 0.5f;
// Максимальная доля бокового движения для возможности спринта
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement",
meta = (ClampMin = "0.1", ClampMax = "1.0"))
float BackwardSpeedMultiplier = 0.7f;
// Множитель скорости при движении назад
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement",
meta = (ClampMin = "0.1", ClampMax = "1.0"))
float SidewaysSpeedMultiplier = 0.8f;
// Множитель скорости при движении вбок
// === Внутренние переменные ===
FVector LastLeftControllerPos;
// Предыдущая позиция левого контроллера для расчета дельты
FVector LastRightControllerPos;
// Предыдущая позиция правого контроллера для расчета дельты
FTimerHandle ArmSwingTimerHandle;
// Хэндл таймера для периодической проверки движения
bool bIsArmSwinging = false;
// Флаг текущего состояния: true если игрок машет руками достаточно интенсивно
void CheckArmSwing();
void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent);
void MoveCharacter(const FInputActionValue& Value);
void HandleMovementInput(const FVector2D& InputValue);
Логика определения скорости:
Слабое отклонение стика (< MinStickMagnitudeForRun) — всегда ходьба, независимо от махов руками
Сильное отклонение стика (≥ MinStickMagnitudeForRun): Движение вперед (ForwardRatio > MinForwardRatioForSprint и боковое отклонение < MaxLateralRatioForSprint):С махами руками → Спринт Без махов руками → Бег Движение назад или вбок → Только бег (спринт невозможен)
Такой подход предотвращает нереалистичный спринт при движении назад или боком, делая механику более естественной. Все пороговые значения можно настроить в редакторе для точной подгонки под ваш проект.
Ссылки на документацию:
Шаг 2: Реализация детекции махов руками
В файле реализации (AVRPlayerCharacter.cpp) создаем функцию проверки:
Как это работает:
Функция вызывается каждые CheckFrequency секунд (по умолчанию 0.02с = 50 раз в секунду) Настройте для оптимальной производительности.
Измеряется расстояние, пройденное каждым контроллером с последнего вызова
Если суммарное расстояние превышает ArmSwingThreshold, считается что игрок "бежит"
Шаг 3: Инициализация системы
В методе BeginPlay() запускаем периодическую проверку:
Ссылки на документацию:
Шаг 4: Интеграция с Enhanced Input System
Теперь нужно связать механику с системой ввода. Сначала настраиваем привязку action'а:
Затем реализуем функцию обработки ввода:
Шаг 5: Управление скоростью персонажа
Важно понимать! В моем примере применение скорости персонажа в зависимости от направления взгляда камеры. Например, стик отодвинут вперед (мы бежим вперед), повернули голову на 90 градусов, мы по прежнему бежим вперед, только уже в ту сторону, когда повернулась голова.
Иногда делают реализации, когда вектор движения применяется от направления капсулы. Направление "вперед" для ввода с джойстика определяется направлением "вперед" капсулы персонажа (или его тела), а не тем, куда смотрит HMD (голова). Игрок может свободно осматриваться головой, не меняя направления движения. При этом повороты самой капсулы (тела персонажа) обычно управляются отдельно, например, правым стиком (snap turn/smooth turn) или физическим поворотом игрока, если включено bUseControllerRotationYaw для персонажа и соответствующая логика в PlayerController.
Вернемся к моему примеру. Основная логика применения скорости находится в HandleMovementInput:
Ссылки на документацию:
Настройка в редакторе
1. Создание Input Action
Создайте новый Input Action IA_MoveCharacter
Установите Value Type: Axis2D
В Input Mapping Context привяжите к левому стику VR контроллера
Укажите персонажу Input Mapping Context
2. Настройка параметров движения
В Blueprint персонажа или в Details панели вы можете настроить все параметры:Параметры махов руками:
Arm Swing Threshold — чувствительность активации спринта (см)
Check Frequency — частота проверки движения контроллеров
Скорости движения:
Sprint Speed — скорость при спринте
Run Speed — скорость при беге
Walk Speed — скорость при ходьбе
Пороги направления:
Min Stick Magnitude For Run — минимальное отклонение стика для бега
Min Forward Ratio For Sprint — доля движения вперед для спринта
Max Lateral Ratio For Sprint — максимальная доля бокового движения для спринта
Множители скорости:
Backward Speed Multiplier — коэффициент замедления при движении назад (0.7 = 70% от обычной скорости)
Sideways Speed Multiplier — коэффициент замедления при движении вбок (0.8 = 80% от обычной скорости)
Демонстрация этой логики на моем проекте:
Заключение
Эта механика делает передвижение в VR более естественным и погружающим. Игроку не нужно думать о кнопках — достаточно начать активнее двигать руками, как при реальном беге. Демонстрация примера показана упрощенно, модифицируйте код под конкретные нужды проекта, все ключевые параметры доступны для настройки прямо в редакторе.
Отправили на ревью в Meta Store страницу нашей первой игры
Две недели мы делали новый полноценный сюжетный трейлер и качественно поставленные скриншоты для аккаунта Dark Trip.
Сегодня отправили сабмишен "Coming Soon" страницы. Если нашу промографику, тексты и возрастные рейтинги примут - на днях будем делать релиз сюжетного трейлера со ссылкой на страничку в сторе.
Волнуемся, но воодушевлены.
Meta XR Audio и MetaSounds в Unreal Engine 5 & VR
Введение
Статья будет посвящена материалу по работе со звуком, плагинах и их установке. Статья может редактироваться в будущем, чтобы всё полезное было в одном месте.
Введение в Attenuation & Spatialization Unreal Engine 5 (Затухающий и Пространственный звук)
Установка Meta XR Audio SDK
Плагин Oculus Spatializer (Oculus Audio) Был заменен на Meta XR Audio. Об этом говорится в документации Meta: https://developer.oculus.com/documentation/unreal/audio-osp-ue/
Обзор Meta XR Audio SDK для Unreal:
Скачать плагин Meta XR Audio для Unreal Engine 5:
Инструкция Перепаковки Плагина Meta XR Audio для другой версии Unreal Engine (не требуется если у вас Unreal Engine 5.4):
В моем случае команда перепаковки в cmd выглядела так:
D:\Unreal_Engine\UE_5.3\Engine\Build\BatchFiles\RunUAT.bat BuildPlugin -plugin="C:\Users\userPC\Downloads\MetaXRAudio\MetaXRAudio.uplugin" -package="C:\temp\MetaXRAudio"
Далее необходимо скопировать metaxraudio64.dll из загруженного плагина v67 в скомпилированный плагин под нашу версию Unreal Engine (в моем случае 5.3.2). Иначе Unreal не сможет запуститься.
Устранение предупреждения: LogAudio: Warning: Failed to load MetaXR Reverb Submix from object path '' in MetaXRSettings. Creating 'MetaXR Reverb Submix' as stub.
После установки плагина, это поле имеет пустое значение, задайте Submix из списка.
Plugins>Meta XR Audio > задайте submix
Доп. информация от Meta по VR аудио:
Описывает, как люди локализуют звук.
Описывает пространственные и передаточные функции, связанные с головой.
Описываются различные устройства для прослушивания, их преимущества и недостатки.
Описывает моделирование окружающей среды, включая реверберацию и отражения.
Теперь, когда мы выяснили, как люди размещают звуки в мире и, что еще важнее, как мы можем заставить людей думать, что звук исходит из определенной точки пространства, нам нужно изучить, как мы должны изменить наш подход к звуковому дизайну, чтобы поддержать пространственную локализацию.
Как и в случае со звуковым дизайном, микширование сцены для виртуальной реальности — это не только наука, но и искусство, и следующие рекомендации могут содержать некоторые оговорки.
Определения технических терминов. Термины VR-аудио.
Meta предоставляет бесплатные, простые в использовании плагины для пространственных преобразований для движков и промежуточного ПО, включая Unity, Unreal, FMOD и Wwise. Наши функции пространственных преобразований поддерживают разработку как для PCVR, так и для Quest, Quest 2, Quest Pro и Quest 3.
Видеоматериал по VR-Audio:
MetaSounds Unreal Engine 5
В Unreal Engine 5 был представлен MetaSounds - встроенный процедурный звуковой движок Unreal Engine.
Документация:
Учебный материал от Epic Games:
Учебный материал от Brain Michael Fuller по MetaSounds:
Сборник туториалов по звуку Unreal Engine 5:
Аудио паки от Oculus/Meta:
Ответ на пост «Играю в Skyrim VR»1
Я недавно выкладывал видео по SkyrimVR, и люди потребовали продолжения. Вот и оно. С песнями и пьянками.
Подскажите игру для руля и VR (пост без рейтинга)
Пост без рейтинга. Скриншоты снизу
Есть старенький, но очень хороший руль от лоджитек, с двумя моторчиками. Использовал его только для Burnout Paradise уж лет как 15.
У сына есть Окулус квест 2
Внимание вопрос! Какие есть хорошие, качественные игры для руля, желательно с поддержкой окулуса. Первое, что приходит на ум, это копать в сторону нид фор спид, но я хз, что там сегодня (я постарел).
Рассматриваются как "условно-торрент-платные", так и просто платные варианты. С VR желательно, но не критично.
Если без VR, то симуляторы автобусов и дальнобойщиков не предлагать. Если с VR, то в целом любые, главное, что бы поддерживали "отдачу".
Пару слов про Burnout Paradise, в целом игра офигительная, отдача в руле офигительная, играбельная вот уже сколько лет, но хочется что-то с VR или просто что-то еще
Всем спасибо!
Играю в Skyrim VR1
Делать летсплей на Скайрим в 2023 по меньшей мере странно.. Но существующие обзоры меня огорчают: все говорят о том, что SkyrimVR - неиграбельная поделка, технология ради технологии. И играть в него надо сидя на диване, с геймпадом в руках, как если бы это был обычный Скайрим, только на огромном 3д экране. Я выражаю категорическое несогласие с таким подходом. Давно хотел снять видео на тему, как можно играть в Скайрим с полным погружением, трекингом движений и отыгрышем ситуаций. Пока это небольшой набросок, который я вообще снимал для своего кореша. Но если зайдет, можно будет снять что-то более осмысленное.. В общем, нужно ваше мнение. Если считаете, что полное говно, и не надо таким заниматься, тоже пишите. Лучше узнать об этом сразу)
Да, предупреждаю, я не сдерживал себя в выражениях, поскольку этот ролик не планировался, как публичный.