Поддержка кроссплатформенности между различными XR устройствами

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

От иммерсивных приложений до игровых миров и 3D-сцен

Наша выделенная команда для VR/AR/MR-разработки, Unity-продакшна и 3D-моделирования и анимации с собственными кейсами и презентациями.

Посетить персонализированный сайт
Показано 1 из 1 услугВсе 242 услуг
Поддержка кроссплатформенности между различными XR устройствами
Сложная
~2-4 недели
Часто задаваемые вопросы
Наши компетенции
Какие этапы разработки игры?
Последние работы
  • image_games_mortal_motors_495_0.webp
    Разработка игры для компании Mortal Motors
    671
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Пошаговая стратегия в фэнтези сеттинге With Fire And Sword
    860
  • image_games_second_team_604_0.webp
    Разработка игры для компании Second term
    490
  • image_games_phoenix_ii_606_0.webp
    3D-анимация — тизер для игры phoenix 2.
    533

id: 228 slug: cross-platform-xr-device-support title_ru: "Поддержка кроссплатформенности между различными XR устройствами" tags: [vr-ar]

Поддержка кроссплатформенности между различными XR устройствами

Написать VR-игру под Quest 3 — это одна задача. Запустить её же на Pico 4, HTC Vive XR Elite и PC через SteamVR без переписывания взаимодействий — совсем другая. Разница в API контроллеров, системах трекинга рук, разрешениях дисплеев и производительности GPU делают кроссплатформенный XR одной из самых трудоёмких задач в мобильном геймдеве.

Где ломается кроссплатформенность на практике

Самая болезненная точка — маппинг инпутов. Meta Quest использует OVRInput с кнопками PrimaryButton, SecondaryButton, PrimaryIndexTrigger. SteamVR (OpenVR) работает через Action System с файлом actions.json. OpenXR унифицирует это через Input System с InputActionAsset, но конкретные пути к кнопкам различаются: /user/hand/left/input/trigger/value для OpenXR — и это ещё относительно стандартно, но grip/pose на разных HMD имеет разный физический смысл и сдвиг позиции.

Второй кейс — hand tracking. На Quest рука трекается через OVR Hand API с суставами OVRSkeleton.BoneId.Hand_Index1. На Pico — через SDK с другим именованием и другим количеством суставов в иерархии. XR Hands (пакет com.unity.xr.hands) решает эту проблему через абстракцию XRHand с XRHandJointID, но поддержка конкретных устройств зависит от версии пакета и нативного провайдера.

Третья — пространственные якоря и Scene Understanding. Meta Spatial Anchors API, ARKit Anchors, OpenXR Spatial Anchors Extension (XR_EXT_spatial_entity) — это три разных API с разной степенью зрелости. Если приложение использует сохранение позиций объектов в реальном пространстве, архитектуру нужно строить с абстракцией над anchor API с самого начала, иначе потом рефакторинг займёт недели.

Архитектурный подход к XR-кроссплатформенности

Основа — OpenXR + Unity XR Plugin Management. OpenXR покрывает Quest (через Meta OpenXR), Pico (PicoXR OpenXR), SteamVR, Windows Mixed Reality. Для каждой платформы подключается соответствующий OpenXR Feature Package, но логика взаимодействий остаётся общей.

Стек:

  • XR Interaction Toolkit — высокоуровневые интерактивные компоненты (XRGrabInteractable, XRRayInteractor, XRDirectInteractor)
  • Unity Input System с InputActionAsset — единый маппинг инпутов, отдельный binding для каждой платформы
  • XR Hands — если нужен hand tracking
  • AR Foundation — для AR-функций на мобильных устройствах

Ключевой паттерн — Device Abstraction Layer: все обращения к нативным SDK оборачиваем в интерфейсы (IHandTrackingProvider, IAnchorService, IHapticFeedback). Это позволяет подключать платформенные реализации через DI без изменения игровой логики.

Из конкретного кейса: в проекте с поддержкой Quest 2/3 и Pico 4 проблема возникла с haptic feedback — Meta OVR SDK поддерживает амплитуду и частоту вибрации (OVRInput.SetControllerVibration(frequency, amplitude)), а стандартный OpenXR путь через XRControllerWithRumble не давал нужной точности на Meta. Решили через feature detection: при старте проверяем наличие Meta-специфичного OpenXR Extension XR_FB_haptic_amplitude_envelope, и если он доступен — используем нативный путь, иначе — стандартный OpenXR.

Тестирование на нескольких устройствах

Полноценное тестирование требует физические устройства. Но значительную часть итераций можно закрыть через:

  • XR Device Simulator в Unity — для базовой проверки логики без HMD
  • Link/Air Link для Quest — запуск в PC режиме для быстрого цикла итераций
  • OpenXR Runtime Switcher — переключение между SteamVR и Oculus runtime на PC для сравнения поведения

Матрица тестирования фиксирует: версию ОС HMD, версию рантайма OpenXR, режим трекинга (6DoF/3DoF), работу с/без hand tracking, производительность (FPS, тепло, GPU время).

Этапы работы

Анализ целевых платформ. Определяем список устройств и функций (hand tracking, passthrough, spatial anchors, мультиплеер). От этого зависит выбор SDK и объём работы.

Аудит существующего проекта (если уже есть кодовая база). Выявляем платформозависимые вызовы, оцениваем объём рефакторинга.

Архитектура абстракций. Проектируем Device Abstraction Layer, выбираем конкретные пакеты и версии.

Реализация и настройка Input Actions. Маппинг для каждой платформы, тестирование в XR Device Simulator.

Тестирование на железе. Прогон на каждом из целевых HMD, профилирование GPU/CPU.

Масштаб задачи Ориентировочные сроки
Перенос Quest-проекта на Pico (только инпуты) 1–2 недели
Поддержка Quest + Pico + SteamVR с нуля 1–2 месяца
Полная XR-платформа с hand tracking и anchors 2–4 месяца

Стоимость рассчитывается индивидуально после аудита проекта и списка целевых устройств.