AR/VR
Unity для XR
Job Simulator на Quest, Beat Saber на Index, IKEA Place на iPhone - три абсолютно разные платформы, но всё это сделано в Unity. Любая XR-студия сегодня стоит перед выбором: писать на нативных SDK Meta/Apple/Google и поддерживать три кодовые базы, или взять Unity XR-стек и собрать одно приложение под всё. В 2020-2024 Unity консолидировала пакеты (XRI, OpenXR, AR Foundation) в единый pipeline. Это XR-чтобы-писать-один-раз - не маркетинговый лозунг, а конкретные API, которые экономят месяцы разработки.
- **Job Simulator (Owlchemy Labs):** один Unity-проект собирается под Quest, PSVR2, SteamVR и Pico. XRI и OpenXR обеспечивают идентичное поведение grab-механики на всех платформах
- **IKEA Place / Houzz:** AR Foundation позволяет одной командой выпускать iOS и Android версии furniture-AR без поддержки двух нативных проектов
- **Bigscreen Beyond, Pico Neo, Quest 3:** новые гарнитуры выходят с OpenXR-поддержкой - значит Unity-приложения работают на них из коробки без портирования
XR Interaction Toolkit: интеракции из коробки
До 2020 года каждый Unity XR-проект изобретал свой grab, teleport, ray-pointer заново. Команды копировали скрипты с YouTube, плодили баги с двумя руками одновременно держащими объект, теряли время на UI raycast. В 2020 Unity выпустила XR Interaction Toolkit (XRI) - официальный пакет с готовыми компонентами: XRGrabInteractable, XRRayInteractor, XRSocketInteractor, локомоция, UI canvas-интеграция. XRI работает поверх любого XR-провайдера (Oculus, OpenXR, Windows MR), поэтому один и тот же код собирается под Quest, Vive, PSVR2.
Архитектура XRI: Interactor (что взаимодействует: рука, контроллер, gaze) + Interactable (с чем взаимодействует: предмет, UI, slot). XRInteractionManager - синглтон-диспетчер, который матчит interactor-interactable по hover/select/activate событиям. Каждый Interactable объявляет, какие типы Interactor его принимают. Этой системой убрано 90% boilerplate-кода предыдущих лет.
Чем XR Interaction Toolkit принципиально отличается от ручного написания grab-скрипта?
OpenXR: единый бэкенд под все гарнитуры
До OpenXR разработчик выбирал SDK на этапе старта: Oculus SDK для Quest, OpenVR/SteamVR для Vive, Windows MR для HoloLens. Перенос между ними означал переписывание input-маппингов, controller-моделей и трекинга. OpenXR (Khronos, 2019) - открытый стандарт от того же консорциума, что выпустил Vulkan. Один API, набор расширений для специфичных фич (eye tracking, hand tracking, passthrough). Unity 2021+ поддерживает OpenXR как основной провайдер; Meta, Valve, Microsoft, Sony, Pico и ByteDance совместимы.
Input в OpenXR абстрагирован через Interaction Profiles - описание контроллера в формате 'producer/profile/component', например '/interaction_profiles/oculus/touch_controller'. Разработчик не пишет код под конкретный контроллер: создаётся Action Map (Grab, Trigger, Teleport), и runtime сам подставляет правильный кнопочный binding для подключённой гарнитуры.
Что именно решает OpenXR в задаче кросс-платформенной разработки?
VR Template: starter-проект как контракт
Unity VR Template - официальный шаблон из Unity Hub, который собирается под OpenXR и содержит готовую сцену: XR Origin с camera offset, локомоция (continuous + teleport), снап-поворот, две сцены-площадки, демо-объекты с XRI. Шаблон не учебный, а production-ready: его берут как контракт начала проекта. Внутри уже настроены XR Plugin Management, Input System Action Maps, рекомендуемые render settings для Quest (single-pass instanced rendering, MSAA 4x, mobile HDR off).
Ключевые компоненты VR Template: XR Origin (бывший XR Rig) - корень сцены с трекинговым space, Main Camera как голова, Left/Right Controller GameObject. Continuous Move Provider и Snap Turn Provider реализуют локомоцию. Tunneling Vignette компонент уменьшает motion sickness при быстром движении. Render Pipeline - URP с настроенным XR rendering, отключённым post-processing для производительности.
Зачем команды берут VR Template вместо пустой 3D-сцены?
AR Foundation: ARKit и ARCore в одном API
Apple ARKit (Swift, Objective-C) и Google ARCore (Java, Kotlin, C) - две независимые AR-платформы с разным API. AR Foundation (Unity, 2018) - пакет-абстракция, позволяющий писать AR-логику один раз и собирать билды под iOS и Android. Архитектура: ARSession управляет жизненным циклом, ARSessionOrigin задаёт координатную систему, специализированные Tracked Managers - ARPlaneManager, ARFaceManager, ARMeshManager, ARAnchorManager - подписываются на события трекинга. Под капотом каждый Manager делегирует работу в native SDK через XR Plugin.
Trackable - базовая абстракция AR Foundation: всё, что AR-система обнаруживает в реальном мире (плоскости, лица, изображения, объекты, точечные облака). Каждый Trackable получает уникальный TrackableId и состояние TrackingState (None/Limited/Tracking). Event-based API: TrackablesChangedEventArgs содержит added/updated/removed - это позволяет инкрементально обновлять виртуальный контент по мере уточнения данных.
Раз есть OpenXR и AR Foundation, можно писать одно приложение под VR и AR одновременно
OpenXR покрывает VR-гарнитуры и MR-устройства с собственным compositor. AR Foundation - отдельный стек для смартфонных AR (ARKit/ARCore). Это разные пайплайны рендеринга, input-модели и UX
VR-приложение работает в полноэкранном стерео-рендеринге с двумя контроллерами. AR на смартфоне - монокулярный pass-through с тач-инпутом и поведением 'смотреть через окно'. Объединение возможно лишь на устройствах вроде Quest 3 (VR + passthrough) или Apple Vision Pro - и даже там разработчик выбирает immersive/shared space на уровне сцены
Что обеспечивает AR Foundation как абстракция?
Ключевые идеи
- **XR Interaction Toolkit** стандартизирует grab/teleport/UI-raycast через Interactor-Interactable контракт - 90% типового XR-кода уходит в пакет.
- **OpenXR** заменяет вендорские SDK единым стандартом Khronos: один билд работает на Quest, Index, Pico, Vive через одинаковые Action Maps.
- **VR Template** - production-готовый стартовый проект с настроенным XR Plugin Management, локомоцией и mobile VR render-настройками.
- **AR Foundation** абстрагирует ARKit и ARCore в один C# API: ARPlaneManager, ARRaycastManager и ARAnchorManager работают одинаково на iOS и Android.
Связанные темы
Unity XR-стек собирает воедино понятия трекинга, input-абстракций и кросс-платформенного рендеринга.
- Введение в VR и AR — Платформенные стеки реализуют ту самую модель шести степеней свободы и стерео-рендеринга, заложенную в основу XR
- Multiplayer XR — Сетевая XR-сессия строится поверх Unity XR Origin и синхронизирует позы контроллеров между клиентами
Вопросы для размышления
- Если OpenXR стандартизирует ввод и трекинг, нужны ли ещё нативные Oculus/Pico SDK? В каких случаях команды осознанно отказываются от OpenXR в пользу вендорского SDK?
- XR Interaction Toolkit берёт на себя интеракции, но не геймплей. Где проходит граница: что должно остаться в XRI, а что выносится в собственный код проекта?
- AR Foundation требует, чтобы устройство было в списке ARCore Supported. Как это влияет на target audience мобильного AR-приложения и оценку доступного рынка?
Связанные уроки
- arvr-12 — Предыдущий урок - фундамент для Unity XR
- arvr-14 — Unreal - альтернативный движок, сравнение обязательно
- arvr-15 — Unity компонент архитектуры XR-системы
- ds-01-arrays — GameObject/Component - как структуры данных в ECS
- st-05-emergence — Сцена Unity - emergent behaviour из компонентов
- cg-01