Если коротко:
Для hand tracking в Unity через OpenXR установите совместимые версии OpenXR Plugin и XR Hands, включите OpenXR для целевой платформы и функцию Hand Tracking. Данные приходят через XRHandSubsystem: проверяйте, что subsystem запущена, рука отслеживается, а конкретный сустав имеет валидную pose. Поддержка зависит от OpenXR runtime и устройства, поэтому оставляйте управление контроллерами как fallback.
Unity OpenXR hand tracking использует OpenXR Plugin для связи с runtime и XR Hands как API кистей. Runtime должен поддерживать XR_EXT_hand_tracking, а приложение — проверять данные.
Какие пакеты и версии нужны
Для Unity 6000.0 проверены XR Hands 1.7.3 и OpenXR Plugin 1.16.1. Для иной версии сверяйтесь с Package Manager.
Минимальный набор:
- XR Plug-in Management и OpenXR Plugin как provider;
- XR Hands для
XRHandSubsystemи joints; - Input System, а для готовых взаимодействий — XR Interaction Toolkit.
XR Hands не получает data от камер: provider реализует subsystem. Основа проекта разобрана в материале Unity и OpenXR, взаимодействия — в руководстве по XR Interaction Toolkit.
Настройка проекта
- Через Package Manager установите XR Hands и OpenXR Plugin.
- Для целевой платформы активируйте OpenXR в разделе управления XR-плагинами.
- В OpenXR Features включите Hand Tracking и исправьте ошибки Project Validation.
- Оставьте нужные controller profiles для резервного ввода.
- Импортируйте sample HandVisualizer. Его skeleton соответствует joint layout OpenXR, но не заменяет логику приложения.
Hand Tracking Feature обновляет XRHandSubsystem. Meta Aim Hand добавляет aim и pinch, но доступен не в каждом runtime.
Как читать данные кисти и суставов
Получите работающий XRHandSubsystem через SubsystemManager.GetSubsystems и подпишитесь на updatedHands. Dynamic update подходит для логики interaction, BeforeRender — для визуального положения с меньшей задержкой.
Кисти доступны как leftHand и rightHand. Проверьте XRHand.isTracked, получите joint через GetJoint(XRHandJointID.IndexTip) и вызовите TryGetPose. false означает невалидную pose либо неподдерживаемую точку. Случаи различают trackingState, jointsInLayout и update flags.
Стандарт OpenXR описывает 26 точек на руку: wrist, palm, суставы и fingertips. Runtime может вернуть pose и radius. Это tracking data, а не модель: XRHandSkeletonDriver переносит позы на Transform-иерархию, mesh лишь рисует руку.
Жесты и interaction
Щипок определяйте по расстоянию между thumb tip и index tip, валидности pose и устойчивости условия. Разные границы включения и выключения уменьшают дребезг.
Для UI и захвата объектов hand data связывают с XRI-interactors. Tracking, gesture и interaction остаются разными слоями: потеря joint не должна вызывать случайный Select. Базовая модель описана в статье OpenXR hand tracking.
Runtime support и fallback на контроллеры
Проверяйте сборку на каждой заявленной гарнитуре: активный OpenXR loader не доказывает поддержку кистей. Если subsystem отсутствует, не запущена, isTracked равен false или joints невалидны, скройте hand interactor и включите controller interactor без перезапуска сцены.
Используйте состояния Hands active, Controllers active и No tracked input. В последнем покажите подсказку, а критичным действиям дайте кнопку. Fallback покрывает выход рук из поля камер и runtime без расширения, не выдавая временную потерю tracking за отказ сцены.
Проверка по шагам
Настройка проекта
Выполнено 0 из 5