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
Три ключевых пакета:
- OpenXR Plugin (
com.unity.xr.openxr) — нижний слой. OpenXR — открытый стандарт от Khronos Group для VR/AR. Заменил собой Oculus SDK, SteamVR, Vive Wave и др. - XR Interaction Toolkit (
com.unity.xr.interaction.toolkit, XRI) — высокоуровневая система: ray-pointers, grab, teleport, locomotion, UI interaction. Главный пакет для разработчика. - 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 в браузере с ограничениями.
OpenXR — это VR-аналог “WebGPU” — единый API, работающий на Quest, Index, PCVR, Vision Pro (с adapter). Сверху — XRI как готовый набор interaction-паттернов.
Базовая настройка
- Edit → Project Settings → XR Plug-in Management → отметьте OpenXR для нужных платформ (Windows / Android для Quest).
- OpenXR feature groups: включите Meta XR feature group для Quest, Khronos для Index/SteamVR.
- Interaction profiles: Oculus Touch Controller, Khronos Simple Controller, HTC Vive Controller — включите все, под которые таргетите.
- Package Manager → установите XR Interaction Toolkit.
- Добавьте на сцену 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).
Включите Snap Turn (поворот рывками вместо плавного) и Tunnel Vision (затемнение периферии при движении) — это снижает sickness у новичков. В Settings меню XRI вашего проекта эти опции должны быть переключаемыми.
Hand-tracking (без контроллеров)
С пакетом XR Hands можно использовать руки вместо контроллеров (Quest 3, Vision Pro):
- Установите
com.unity.xr.hands. - В Project Settings → OpenXR → активируйте Hand Tracking feature.
- В сцене вместо
XR Controller—XR Hand. У него skeleton с 26 joints (knuckles, fingertips). - Готовые 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.
Подводные камни
- Comfort и motion sickness — тестируйте на target-аудитории. Что комфортно вам, может тошнить других.
- UI в World Space — основной режим для VR. Screen Space Overlay не работает в VR.
- Audio Listener — должен быть на VR Camera (не на XR Origin).
- Spatial Audio обязателен — VR без 3D-звука теряет половину иммерсии.