Если коротко:

В Unity XR Interaction Toolkit перемещение настраивается через XR Origin, XR Body Transformer, Locomotion Mediator и отдельные Locomotion Provider. Для телепорта добавляют Teleportation Provider, луч и поверхности Teleportation Area либо фиксированные Teleportation Anchor. Для плавного хода и поворота используют Continuous Move и Continuous Turn, а для более комфортной альтернативы — Snap Turn. Все способы должны обращаться к одному XR Origin через общий Mediator и иметь раздельные Input Actions.

Unity VR locomotion в XR Interaction Toolkit строится не одним скриптом движения, а цепочкой компонентов. XR Origin представляет отслеживаемое пространство, отдельный provider рассчитывает перенос или поворот, Locomotion Mediator согласует запрос, а XR Body Transformer применяет преобразование. Такая схема позволяет держать телепорт, плавный ход и turn в одной сцене, не заставляя несколько скриптов напрямую менять Transform камеры.

Ниже используется архитектура XRI 3.x. В старых руководствах встречается Locomotion System, тогда как документация ветки 3.x описывает Locomotion Mediator и XR Body Transformer. Не смешивайте компоненты и инструкции разных поколений пакета.

Что входит в систему локомоции XRI

Основные роли распределены так:

  • XR Origin содержит корень отслеживаемого пространства, камеру и объекты контроллеров;
  • XR Body Transformer получает очередь перемещений и применяет её к XR Origin в Update;
  • Locomotion Mediator управляет состояниями provider и выдаёт им доступ к transformer;
  • Teleportation Provider, Continuous Move Provider, Snap Turn Provider и Continuous Turn Provider создают конкретные преобразования;
  • Input Action Manager включает набор действий, из которого компоненты читают оси стиков и кнопки;
  • interactors и interactables определяют, куда разрешён телепорт и как пользователь выбирает цель.

В типовом запросе Locomotion Provider рассчитывает перемещение, просит Mediator начать locomotion и после разрешения ставит преобразование в очередь XR Body Transformer. Очередь учитывает Transform Priority; операции с меньшим значением применяются раньше. Это важно, если в одном кадре работают движение, gravity, turn или собственный provider.

Перед настройкой локомоции соберите базовую сцену по руководству Unity XRI. Если проект только создаётся, сначала настройте Unity и OpenXR, профили контроллеров и проверку ввода.

Подготовка XR Origin и Input Actions

Для быстрого старта импортируйте Starter Assets через Samples у установленного XR Interaction Toolkit. Этот набор содержит XRI Default Input Actions, presets, готовый XR Origin и демонстрационные объекты. Он удобен как проверяемая отправная точка, но версия sample должна совпадать с версией пакета: после обновления старые ссылки на скрипты и actions могут разорваться.

Минимальная последовательность:

  1. Добавьте в сцену XR Origin (XR Rig) из меню GameObject → XR либо используйте prefab Starter Assets.
  2. Убедитесь, что у корневого GameObject есть Locomotion Mediator и связанный XR Body Transformer.
  3. Добавьте Input Action Manager и укажите XRI Default Input Actions или собственный action asset.
  4. Разведите действия Move, Turn и Teleport Mode Activate по понятным bindings.
  5. Проверьте, что ссылки Mediator у всех providers ведут к одному компоненту нужного XR Origin.

Действия движения и поворота обычно имеют тип Value и control type Vector2. Само наличие binding в asset недостаточно: asset должен быть включён, а ссылка на action — назначена в Inspector. Если controller виден и захват работает, но ход или snap turn отсутствует, сначала проверьте именно action, его binding и Input Action Manager.

Телепорт: Provider, луч и допустимая цель

Телепортация состоит из трёх частей. Teleportation Provider переносит XR Origin, XR Ray Interactor выбирает точку, а компонент назначения решает, является ли попадание допустимым. Одного Teleportation Provider на сцену обычно достаточно, хотя XRI допускает несколько экземпляров.

Добавьте provider на locomotion-объект внутри XR Origin и назначьте его Mediator. На контроллере создайте или включите ray interactor для телепорта. Для дуги документация Unity предлагает Projectile Curve; у прямой линии проще геометрия, но она хуже показывает точку на полу за препятствием. XR Interactor Line Visual отображает луч, а reticle помогает отличить допустимое место от запрещённого.

Не оставляйте телепортационный луч постоянно конкурировать с лучом интерфейса и дальним взаимодействием. В prefab Starter Assets для этого используется отдельный Teleport Interactor и действия включения режима. В собственном проекте задайте приоритеты Interaction Group либо явно активируйте нужный interactor только на время прицеливания.

Teleportation Area

Teleportation Area разрешает выбрать любую точку на collider поверхности. Создать её можно через GameObject → XR → Teleportation Area либо добавить компонент на подготовленный объект. Луч пересекает collider, interactable формирует teleportation request, а provider переносит пользователя в выбранную позицию.

Area подходит для свободного перемещения по полу, площадке или большой доступной зоне. Не размечайте ею декоративную геометрию автоматически: collider может включить край лестницы, стол, наклон или участок за закрытой дверью. Удобнее завести отдельный слой телепорта и поместить туда только проверенные поверхности. Interaction Layer Mask у interactor и area должны пересекаться.

Поле Match Orientation определяет ориентацию после переноса. World Space Up сохраняет обычный вертикальный мир, Target Up согласует верх XR Origin с верхом цели, Target Up And Forward также задаёт направление вперёд, а None не меняет rotation. Для стандартного пола не включайте ориентацию по наклонной поверхности без необходимости: резкая смена вертикали может нарушить пространственное ожидание пользователя.

Teleportation Anchor

Teleportation Anchor задаёт конкретное место и при необходимости rotation. В Teleport Anchor Transform укажите transform прибытия. Anchor удобен у дверей, рабочих станций, кресел, обзорных точек и других мест, где положение пользователя должно быть предсказуемым.

Коллайдер anchor служит целью луча, но конечная позиция берётся из Teleport Anchor Transform. Поэтому его стоит вынести в дочерний GameObject: так визуальную площадку можно масштабировать независимо от точки прибытия. Разверните forward в безопасную сторону, оставьте запас перед стеной и проверьте положение головы для разных физических ростов.

Area и anchor решают разные задачи. Area даёт свободу выбора на поверхности; anchor гарантирует точку и направление. В одной сцене их можно сочетать: свободный пол размечать areas, а узкие или сценарные места — anchors.

Непрерывное движение стиком

Continuous Move Provider читает двумерную ось и непрерывно смещает rig. Назначьте Left Hand Move Input или Right Hand Move Input, затем задайте Move Speed. Начинайте тестирование с умеренной скорости и выносите её в пользовательские настройки, а не фиксируйте одно значение для всех.

Ключевое поле — Forward Source. Оно определяет, что считать направлением вперёд. Если указать camera transform, стик ведёт относительно взгляда; если transform руки — относительно controller. Оба варианта допустимы, но поведение должно быть явно обозначено в настройках. Не оставляйте поле случайно привязанным к объекту, который наклоняется по вертикали: движение по земле обычно вычисляется в горизонтальной плоскости.

Enable Strafe разрешает боковое перемещение. Enable Fly снимает ограничение на плоскость и имеет смысл для полёта или невесомости; для обычной ходьбы его не включают. В ветке XRI 3.1 gravity вынесена в общую архитектуру Gravity Provider, хотя старые поля сохранены для совместимости. Если используется CharacterController, проверьте столкновения, высоту capsule и поведение на ступенях.

Плавное движение нельзя тестировать только в редакторе. В гарнитуре проверьте:

  • движение вперёд при разных направлениях головы и рук;
  • strafe у стены и на узком проходе;
  • остановку при отпускании стика и работу dead zone;
  • спуск, ступени, склоны, падение и восстановление после края;
  • блокировку хода во время меню, загрузки и взаимодействий, где перемещение запрещено;
  • отсутствие прохода камеры сквозь collider при физическом наклоне пользователя.

Snap Turn и Continuous Turn

Перемещение и поворот — разные providers и разные Input Actions. Snap Turn Provider вращает rig на фиксированный угол после отклонения оси. Основные поля: Turn Amount, Debounce Time, включение left/right turn и при необходимости разворота на 180°. Delay Time откладывает первый snap и может дать время на появление vignette.

Continuous Turn Provider вращает XR Origin плавно, пока ось отклонена. Для него задают скорость в градусах в секунду. Такой turn обеспечивает непрерывный визуальный поток, поэтому некоторым пользователям переносится хуже ступенчатого. Не включайте одновременно обработку одного и того же стика двумя providers: переключайте actions или активность компонентов в зависимости от выбранного режима.

Практичная схема настроек:

  • Teleport + Snap Turn как более осторожный начальный профиль;
  • Continuous Move + Snap Turn как промежуточный вариант;
  • Continuous Move + Continuous Turn для пользователей, предпочитающих плавное управление;
  • физический поворот без искусственного turn там, где позволяет пространство и сценарий.

Не называйте один вариант гарантированно комфортным. Реакция индивидуальна, а дискомфорт зависит не только от locomotion, но и от задержки, частоты кадров, ускорений, масштаба мира и длительности сессии.

Опции комфорта

Режим движения следует выбирать в меню до активной сцены и разрешать менять без перезапуска. Полезный минимум: тип move, тип turn, скорость, угол snap, направление относительно головы или руки и vignette для плавного хода или поворота.

XRI содержит Tunneling Vignette Controller. Виньетка сужает периферийную область во время искусственного движения; параметры появления и исчезновения надо подбирать без резкого мигания. Это вспомогательная мера, а не доказательство отсутствия укачивания. Не включайте её без возможности регулировки или отключения.

Также избегайте непредсказуемого ускорения камеры, автоматического покачивания головы и принудительного поворота во время взаимодействия. Сохраняйте стабильный горизонт, показывайте валидную точку teleportation до подтверждения и не переносите пользователя внутрь объекта. Общие различия способов описаны в материале про телепорт и плавное движение в VR.

Как переключать режимы без конфликтов

Оставить все компоненты включёнными можно только при разведённых actions и понятных правилах приоритета. Надёжнее завести настройку locomotion profile, которая включает нужные bindings или providers как согласованную группу. Например, при выборе телепорта отключается Continuous Move, но сохраняется Snap Turn; при выборе smooth move активируется Continuous Move и выбранный тип поворота.

Перед переключением сбросьте накопленное состояние ввода, чтобы удерживаемый стик не вызвал движение сразу после закрытия меню. Во время teleport aiming можно временно блокировать move и turn, затем возвращать их после завершения или отмены запроса. Если собственные providers ставят преобразования в ту же очередь, назначьте осмысленный Transform Priority и проверьте порядок с gravity.

Типовые неисправности

Луч виден, но цель не выбирается. Проверьте collider, Interaction Layer Mask, тип ray interactor и активность teleport action. Убедитесь, что объект действительно содержит Teleportation Area или Teleportation Anchor, а не только материал с похожей разметкой.

Цель подсвечивается, но переноса нет. Проверьте ссылку на Teleportation Provider, его Mediator и XR Body Transformer. Не должно быть второго XR Origin, который принимает ввод или отображается камерой вместо перемещаемого.

После телепорта пользователь смотрит в стену. Для anchor проверьте forward у Teleport Anchor Transform и Match Orientation. Для area решите, нужно ли сохранять прежний rotation или принимать направление контроллера.

Стик работает в меню, но не двигает rig. Action может быть назначен UI, но не Continuous Move Provider. Проверьте тип Value/Vector2, binding нужной руки, включение asset и отсутствие компонента, который отключает action.

Поворот срабатывает дважды. Обычно один input одновременно читают Snap Turn и Continuous Turn либо дублируются bindings левой и правой руки. Оставьте активным один turn provider для выбранного профиля.

Пользователь проходит сквозь препятствия. Перенос Transform сам по себе не создаёт физическое ограничение. Настройте CharacterController, collision layers и допустимые поверхности, затем проверяйте реальное положение HMD относительно capsule.

Проверка перед сборкой

Пройдите всю сцену каждым доступным профилем locomotion. Для teleportation проверьте края areas, все anchors, ориентацию прибытия и недоступные поверхности. Для continuous move — столкновения, склоны, высоты и остановку ввода. Для snap и continuous turn — настройки скорости, угла, dead zone и отсутствие двойного чтения.

После desktop-теста соберите проект на каждую целевую runtime-платформу. Input bindings, частота кадров и поведение controller могут отличаться. Итоговая конфигурация должна сохранять физическое смещение головы внутри tracking space и перемещать именно корень XR Origin; камера остаётся ведомой трекингом устройства.

Поделиться:TelegramВКонтакте

Источники

  1. Unity XRI — Locomotion overview
  2. Unity XRI — Create a scene with locomotion
  3. Unity XRI — Teleportation
  4. Unity XRI — Continuous Move Provider
  5. Unity XRI — Snap Turn Provider