Вибір та настройка XR Interaction Toolkit для механік ігор
XR Interaction Toolkit (XRIT) — офіційний пакет Unity для VR/AR взаємодій. Звучить як «беремо з Package Manager та готово». На практиці: має свою архітектуру, своє компроміси, неправильна настройка дає механіки, які працюють не так, як очікувалось, або performance проблеми через лишні update-цикли.
Версія має значення
XRIT 2.x та 3.x — це фактично різні системи. Версія 3.x переписала Input handling з Legacy Input Manager на новий Input System, змінила архітектуру Interactor/Interactable, додала Affordance System для візуальних станів. Якщо проект починав на 2.5, а документацію читали для 3.0 — частина API просто не існує.
Перед початком настройки: зафіксувати версію XRIT у manifest.json, переконатися, що Input System Package (com.unity.inputsystem) версії ≥ 1.6, та що XR Plugin Management налаштований під цільові платформи. Без явного вказівника OpenXR Loader або Oculus XR Plugin у XR Plug-in Management багато компонентів XRIT просто не ініціалізуються без ясного повідомлення про помилку.
XR Origin: правильна структура сцени
Корінь всієї VR-сцени — XR Origin. Неправильна його настройка — джерело 80% проблем з позиціонуванням та масштабом.
Tracking Origin Mode повинен відповідати типу гри. Floor — для room-scale, гравець стоїть на полу, Y=0 це реальний пол. Device — для stationary, початок координат там, де шлем при старті. Якщо вибрати неправильно, аватар гравця виявиться либо під полом, либо в повітрі.
Camera Floor Offset Object — проміжний об'єкт між XR Origin та Camera Offset. Його Y-позиція у Device-режимі задає віртуальну висоту очей (зазвичай 1.5–1.8 м). У Floor-режимі його Y = 0.
Структура ієрархії: XR Origin → Camera Offset → Main Camera (шлем) + LeftHand Controller + RightHand Controller. Додавати ігрові об'єкти напрямку до Camera Offset — погана практика: вони рухаються з головою. Елементи, які повинні бути в світі — повинні бути у світовому просторі.
Настройка XRGrabInteractable під конкретні механіки
Стандартний XRGrabInteractable працює з коробки для простих випадків. Для нестандартних — потрібно розуміти його внутрішність.
Movement Type визначає, як об'єкт слідує за рукою:
-
Instantaneous— телепортується до позиції attach point щокадру. Немає фізики. Для інтерфейсних елементів. -
Kinematic— Rigidbody переміщується через MovePosition/MoveRotation. Коректно взаємодіє з іншими Rigidbody та коллайдерами, але може «проходити» через статичні colliders при високій швидкості. -
VelocityTracking— об'єкт отримує velocity, яка тягне його до цільової позиції. Найбільш «фізичний» варіант, кращий для об'єктів, які можуть бути заблоковані іншими об'єктами. Вимагає тонкої настройкиTrackingSpeedтаTrackingRotationSpeed.
Для оружія зазвичай VelocityTracking з TrackingSpeed = 12–15 та окремою обробкою кидка через SelectExited event + Rigidbody.AddForce з розрахунком velocity з історії позицій за останні 5 кадрів.
Attach Transform — критично важливий параметр, який часто не настройюють. Без явного Attach Transform об'єкт прикріплюється до позиції контролера — це правильно тільки якщо хват повинен бути у основи. Для меча attach point повинен бути у рукояті; для пістолета — у рукоятці з правильним кутом. Створюємо пустий child-об'єкт з потрібною позицією та ротацією, призначаємо у поле Attach Transform.
Socket Interactor для розміщення об'єктів
XRSocketInteractor — для механік «положити об'єкт на полицю/в слот». Часті проблеми: об'єкт прибуває при snapping якщо Snap Threshold занадто великий (рекомендуємо 0.1–0.2 м), або snap не відбувається якщо Interactor Layer Mask не співпадає з тегами Interactable. Перевіряємо: на XRSocketInteractor Interaction Layer Mask повинен включати шари всіх об'єктів, які можна положити у слот.
Для складних механік (оружие з модулями, головоломки зі збіркою) стандартний Socket часто недостатній — пишемо кастомний Interactor з наслідуванням від XRBaseInteractor, переопределяємо CanHover та CanSelect з додатковими умовами (тип об'єкту, орієнтація, стан).
Ray Interactor для UI та дистанційної взаємодії
XRRayInteractor + XRUIInputModule для взаємодії з World Space Canvas. Типова проблема: ray проходит сквозь UI-елементи або спрацьовує на елементи за іншими елементами. Рішення: правильний sorting layer на Canvas та Blocked Physics Raycasts = true на GraphicRaycaster.
Для ігрових об'єктів XRRayInteractor у парі з XRInteractableSnapVolume дає «притягування» луча до центра об'єкту при приближенні — покращує точність взаємодії з дрібними об'єктами без зміни коллайдера.
| Задача по настройці | Ориентировочні терміни |
|---|---|
| Базова настройка XRIT (grab + ray + socket) | 3–5 днів |
| Кастомні Interactor/Interactable під механіки | 1–2 тижня |
| Повна система взаємодій для гри | 3–6 тижнів |
Вартість розраховується після аналізу ігрових механік та цільових платформ.





