~3 мин чтения

XR / OpenXR — VR-приложения в Unity

XR Interaction Toolkit, OpenXR plugin, базовая VR-сцена с teleport, grab и hand-tracking.

VR/AR (Unity называет это XR — eXtended Reality) — большая отдельная вселенная. Unity исторически один из лидеров рынка VR-разработки. Эта глава — короткий entry point: что нужно знать, чтобы запустить базовую сцену на Meta Quest, Valve Index или PCVR.

Стек XR в Unity 6

Три ключевых пакета:

  1. OpenXR Plugin (com.unity.xr.openxr) — нижний слой. OpenXR — открытый стандарт от Khronos Group для VR/AR. Заменил собой Oculus SDK, SteamVR, Vive Wave и др.
  2. XR Interaction Toolkit (com.unity.xr.interaction.toolkit, XRI) — высокоуровневая система: ray-pointers, grab, teleport, locomotion, UI interaction. Главный пакет для разработчика.
  3. XR Hands (com.unity.xr.hands) — hand-tracking (без контроллеров) для Quest 3, Vision Pro.

Дополнительно:

  • AR Foundation (com.unity.xr.arfoundation) — для AR (мобильные ARCore/ARKit, Vision Pro pass-through).
Веб

WebXR Device API. Концептуально похоже — единый API для VR/AR на разных устройствах. Только Unity OpenXR полноценный native, а WebXR в браузере с ограничениями.

Unity

OpenXR — это VR-аналог “WebGPU” — единый API, работающий на Quest, Index, PCVR, Vision Pro (с adapter). Сверху — XRI как готовый набор interaction-паттернов.

Базовая настройка

  1. Edit → Project Settings → XR Plug-in Management → отметьте OpenXR для нужных платформ (Windows / Android для Quest).
  2. OpenXR feature groups: включите Meta XR feature group для Quest, Khronos для Index/SteamVR.
  3. Interaction profiles: Oculus Touch Controller, Khronos Simple Controller, HTC Vive Controller — включите все, под которые таргетите.
  4. Package Manager → установите XR Interaction Toolkit.
  5. Добавьте на сцену XRI Sample → XR Origin (XR Rig).

XR Origin — корневой узел VR-сцены

XR Origin (XR Rig)            ← position и rotation отслеживают пол игрока
├── Camera Offset
│   ├── Main Camera           ← XR camera, tracked
│   ├── Left Controller        ← XR Controller (Direct + Ray Interactor)
│   └── Right Controller       ← XR Controller
└── Locomotion System
    ├── Teleportation Provider
    └── Continuous Move Provider

XR Origin — это GameObject, который соответствует “положению пользователя в реальном пространстве”. Когда играющий ходит по комнате, его Main Camera внутри XR Origin двигается. Когда хотите телепортировать игрока — двигаете XR Origin.

Простой grab и ray-interaction

XRI поставляется с готовыми компонентами:

  • XR Ray Interactor — луч из контроллера для дальнего выбора.
  • XR Direct Interactor — взять предмет рукой при касании.
  • XR Grab Interactable — на предмете, чтобы его можно было схватить.
  • XR Simple Interactable — на кнопке/двери для tap-action.
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
using UnityEngine.XR.Interaction.Toolkit.Interactables;

[RequireComponent(typeof(XRGrabInteractable))]
public class PickupSword : MonoBehaviour
{
    private XRGrabInteractable _grab;

    private void Awake() {
        _grab = GetComponent<XRGrabInteractable>();
        _grab.selectEntered.AddListener(OnPickedUp);
        _grab.selectExited.AddListener(OnDropped);
    }

    private void OnPickedUp(SelectEnterEventArgs args) {
        Debug.Log($"Picked up by {args.interactorObject}");
    }

    private void OnDropped(SelectExitEventArgs args) {
        // Возможно вернуть на место через 5 секунд
    }
}

XRGrabInteractable сам отрабатывает physics, attach point, throw velocity — вы только подписываетесь на события.

Teleport-locomotion

Стандартный VR-паттерн “не вызывает motion sickness”:

XR Origin
└── Locomotion System
    ├── Teleportation Provider

Teleport Area (на полу)
└── Teleportation Area (XR Interactor target)
    Collider: Plane или Mesh

XR Right Controller
├── XR Ray Interactor (с TeleportRequest line type)

Игрок наводит луч на Teleport Area → клик → XR Origin прыгает туда. XRI обрабатывает выделение target и анимацию.

Альтернативно — Continuous Move Provider для smooth stick-driven movement (для опытных игроков, которым не плохо в VR).

Comfort settings важны

Включите Snap Turn (поворот рывками вместо плавного) и Tunnel Vision (затемнение периферии при движении) — это снижает sickness у новичков. В Settings меню XRI вашего проекта эти опции должны быть переключаемыми.

Hand-tracking (без контроллеров)

С пакетом XR Hands можно использовать руки вместо контроллеров (Quest 3, Vision Pro):

  1. Установите com.unity.xr.hands.
  2. В Project Settings → OpenXR → активируйте Hand Tracking feature.
  3. В сцене вместо XR ControllerXR Hand. У него skeleton с 26 joints (knuckles, fingertips).
  4. Готовые gesture-detection (point, pinch, fist) — через XRHandTrackingEvents.
using UnityEngine.XR.Hands;

public class PinchDetector : MonoBehaviour
{
    [SerializeField] private XRHandTrackingEvents handEvents;

    private void OnEnable() {
        handEvents.poseUpdated.AddListener(OnPoseUpdated);
    }

    private void OnPoseUpdated(XRHandJointsUpdatedEventArgs args) {
        if (args.hand.GetJoint(XRHandJointID.IndexTip).TryGetPose(out Pose indexPose) &&
            args.hand.GetJoint(XRHandJointID.ThumbTip).TryGetPose(out Pose thumbPose)) {
            float pinch = Vector3.Distance(indexPose.position, thumbPose.position);
            if (pinch < 0.02f) {
                Debug.Log("Pinching!");
            }
        }
    }
}

Performance — главные правила

VR требует минимум 72 FPS на Quest, 90 FPS на PCVR, 120 FPS на Index/Vision Pro — без просадок. Это жёстче, чем обычная игра.

  • Forward+ или Mobile renderer обязателен.
  • MSAA 4× — стандарт для VR (anti-aliasing критичен).
  • Single-Pass Instanced rendering — обязательно (Project Settings → XR Plug-in Management → OpenXR → Render Mode).
  • Foveated rendering — снижение качества на периферии (на Quest Pro, Vision Pro). Включается через OpenXR features.
  • Бюджет polygon’ов на Quest 2 — ~350k треугольников в кадре. На Quest 3 — больше, но не ×10.

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

  • Editor Play Mode + XR Device Simulator — без headset, мышью эмулируется. В пакете com.unity.xr.interaction.toolkit.samples.starter-assets.
  • PCVR (Link/AirLink) — Quest подключён к ПК, Play Mode сразу на headset.
  • Standalone Quest build.apk, ставится через ADB или Meta Quest Developer Hub.

Подводные камни

  1. Comfort и motion sickness — тестируйте на target-аудитории. Что комфортно вам, может тошнить других.
  2. UI в World Space — основной режим для VR. Screen Space Overlay не работает в VR.
  3. Audio Listener — должен быть на VR Camera (не на XR Origin).
  4. Spatial Audio обязателен — VR без 3D-звука теряет половину иммерсии.