Проектирование системы перемещения (Teleportation/Locomotion) в VR
Движение в VR — это не геймплейная мелочь. Это основная причина, по которой игроки бросают VR-игры в первые 20 минут или возвращаются каждый день. Неправильно реализованная локомоция — прямой путь к motion sickness. Правильная — это прозрачная система, которую игрок перестаёт замечать через несколько минут.
Физика дискомфорта: почему плавное движение тошнит
Motion sickness в VR возникает из-за vection — иллюзии движения при его отсутствии в реальности. Зрительная система сообщает мозгу «мы движемся», вестибулярный аппарат — «мы стоим», конфликт вызывает тошноту у 40–60% аудитории при первом опыте.
Плавное движение через стик — максимальный triгger для vection. Это не значит, что его нельзя использовать. Это значит, что его нужно реализовать с mitigation механиками.
Главный из них — locomotion vignette. При движении периферийное зрение (за пределами 40–50° от центра) затемняется через tinted overlay. Мозг воспринимает движение только центральной зоной, что снижает vection. В Unity это реализуется через post-processing Vignette effect с динамической интенсивностью, привязанной через RTPC к скорости движения, или через специализированный компонент — TunnelingVignette в XRIT 3.x (появился как опциональный провайдер в Locomotion System).
Параметры vignette для стартовой настройки: easeInTime = 0.15 с, easeOutTime = 0.3 с, featheringEffect = 0.3, vignetteIntensity = 0.6. Всё это нужно вынести в Comfort Settings — разные игроки имеют разный порог чувствительности.
Телепортация: не просто «перенести позицию»
Телепортация кажется простой: нажал кнопку, выбрал точку, переместился. На деле есть несколько деталей, которые разделяют «работает» и «работает хорошо».
Arc визуализация — парабола от контроллера к точке телепортации. В XRIT реализуется через XRRayInteractor в режиме Projectile Curve + TeleportationProvider. Параметры параболы: velocity = 8–12 (меньше — дуга слишком крутая, больше — слишком пологая), acceleration = -9.8 (гравитация). Точка попадания определяется через raycast против Teleportation Area/Anchor colliders с Layer Mask только на Teleportation слой.
Валидность точки телепортации. Нельзя телепортироваться в воздух, в стену, в NavMesh-недоступную зону. TeleportationArea проверяет только наличие коллайдера, не NavMesh. Если нужна проверка по NavMesh — кастомный TeleportationArea с override ValidateTeleportation, который вызывает NavMesh.SamplePosition в точке приземления.
Ориентация после телепортации. Простой вариант: сохранить текущую ориентацию. Лучший вариант: дать игроку указать направление взгляда после телепортации через ротацию стика в момент удержания кнопки. TeleportationProvider поддерживает MatchOrientation = TargetUpAndForward — XR Origin поворачивается так, что игрок после телепортации смотрит в направлении, указанном при выборе точки.
Transition анимация. Мгновенная телепортация — резкая. Fade to black + fade in за 0.2–0.3 с — не задерживает игрока, но убирает «прыжок» камеры. Реализация: ScreenFadeProvider в Locomotion System, который перехватывает TeleportationProvider.teleportRequest и добавляет fade через корутину перед фактическим перемещением XR Origin.
Гибридная система: когда нужны оба типа
Большинство современных VR-игр используют оба типа локомоции и дают игроку выбор в настройках. Архитектура Locomotion System в XRIT это поддерживает: на одном LocomotionSystem можно зарегистрировать несколько LocomotionProvider одновременно.
Важный нюанс: ContinuousMoveProvider и TeleportationProvider могут конфликтовать при одновременном вводе. LocomotionSystem имеет exclusivityMode — когда один провайдер активен, другие блокируются. Это правильное поведение, но нужно убедиться, что приоритеты расставлены корректно: телепортация должна иметь приоритет над плавным движением (при нажатии кнопки телепортации — плавное движение прекращается).
Snap Turn vs Smooth Turn
Snap Turn — мгновенный поворот на фиксированный угол (обычно 30°, 45° или 60°). Не вызывает дискомфорта — нет continuous rotation. Реализуется через SnapTurnProvider. Настройки: turnAmount = 45°, debounceTime = 0.2 с (чтобы не вращаться слишком быстро при удержании стика).
Smooth Turn — непрерывный поворот через ContinuousTurnProvider. Вызывает меньше дискомфорта, чем плавное движение вперёд, но всё равно неприятен части аудитории. Максимально допустимая скорость поворота для comfort: 60–90°/с.
Для боевых игр, где важна быстрая ориентировка — hybrid: snap turn с небольшим углом (22.5° или 30°) позволяет быстро разворачиваться без дискомфорта.
Сроки проектирования и реализации
| Система | Ориентировочные сроки |
|---|---|
| Базовая телепортация (XRIT из коробки) | 3–5 дней |
| Телепортация + smooth + snap + настройки | 1–2 недели |
| Кастомная система с NavMesh + transition + vignette | 2–4 недели |
| Полная locomotion система с comfort profiles | 3–5 недель |
Стоимость рассчитывается после анализа игровых требований и целевых платформ.





