В VR-проекте я стремился сделать передвижение максимально естественным и интуитивным, отказавшись от лишних кнопок там, где это возможно. Одной из таких механик стал спринт, который активируется не отдельной кнопкой, а естественным действием игрока – интенсивными махами руками, похожими на бег.
Вот как это реализовано:
1. Детекция "Махов Руками" (Arm Swinging):
- В классе персонажа есть функция CheckArmSwing, которая выполняется регулярно (частота настраивается в CharacterDataAsset через переменную).
- Эта функция отслеживает локальные координаты левого и правого Motion Controller (LeftMotionController, RightMotionController) относительно их родительского компонента
- На каждом шаге проверки вычисляется расстояние, на которое сместился каждый контроллер с момента предыдущей проверки (LeftMoveDist, RightMoveDist).
- Эти расстояния суммируются (ArmActivity). Если суммарная дистанция (ArmActivity) превышает заданный порог (ArmSwingThreshold из USYNXRCharacterDataAsset), система считает, что игрок активно машет руками, и устанавливает флаг bIsArmSwinging в true.
2. Управление Скоростью:
- Если все условия для спринта выполнены, устанавливаем целевую скорость (BaseSpeed) равной SprintSpeed (значение берется из CharacterDataAsset).
- Если условия спринта не выполнены, выбирается RunSpeed или WalkSpeed в зависимости от силы наклона стика.
В итоге: мы получаем систему, где игрок может перейти от ходьбы к бегу, просто сильнее отклонив стик, а для активации спринта ему нужно дополнительно совершить естественное для бега движение – махи руками. Это усиливает погружение и освобождает кнопки контроллера для других действий. Все ключевые параметры скорости и пороги детекции махов настраиваются централизованно через CharacterDataAsset.
Телеграм канал - t.me/unrealengine_vr
Чат - t.me/unrealengine_vrchat