agentsclimarketplace

Unity xr

Skill IdoCohen560/claude-unity-game-studio/unity-knowledge-skills/skills/unity-xr

Unity 6 XR development guide. Use when building VR, AR, or MR experiences. Covers XR Interaction Toolkit, XR Plug-in Management, OpenXR, hand tracking, controllers, haptics, AR Foundation (plane detection, anchors, image tracking), and platform-specific setup (Meta Quest, Apple Vision Pro). Based on Unity 6.3 LTS documentation.From its SKILL.md

Install
npx -y skills add IdoCohen560/claude-unity-game-studio --skill unity-xr

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 12 stars12 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

15.0 KB, ~3.4k tokens by cl100k_base, as published. Nobody here has run it

Unity 6 XR Development Guide

Source: Unity 6.3 LTS Documentation (6000.3)

XR Architecture Overview

Unity defines XR as encompassing three application types:

  • Virtual Reality (VR) -- The application simulates a self-contained environment around the user
  • Mixed Reality (MR) -- Combines virtual environments with real-world settings for interaction
  • Augmented Reality (AR) -- The application layers content over a view of the real world

The XR stack in Unity 6 consists of:

  1. XR Plug-in Management -- Discovers and loads platform XR SDKs
  2. OpenXR Plugin -- Open, royalty-free standard by Khronos for cross-platform XR
  3. XR Interaction Toolkit (XRI) -- High-level component-based interaction system
  4. AR Foundation -- Cross-platform AR framework with provider plug-in architecture
  5. Input System -- Action-based input required by OpenXR and XRI

XR Plug-in Management

Configure via Edit > Project Settings > XR Plug-in Management.

  • Enable OpenXR and desired Feature Groups per platform
  • Select Interaction Profiles (controller mappings) in the OpenXR > Features tab
  • Run Project Validation for build-time compatibility checks
  • Verify the active runtime matches target hardware

Supported Runtimes and Platforms

RuntimeTargetGraphics
Windows Mixed RealityWin64DX11
Oculus PC + LinkWin64DX11
Meta QuestAndroid arm64Vulkan
Magic Leap 2Android x64Vulkan
SteamVRWin64DX11

OpenXR Interaction Profiles

  • Eye Gaze Interaction
  • HTC Vive Controller
  • Khronos Simple Controller
  • Microsoft Motion Controller
  • Oculus Touch Controller
  • Valve Index Controller

OpenXR Scripting API

// Iterate all OpenXR features
var features = OpenXRSettings.Instance.GetFeatures();
foreach (var feature in features)
{
    Debug.Log($"Feature: {feature.name}, Enabled: {feature.enabled}");
}

// Get a specific feature by type
var feature = OpenXRSettings.Instance.GetFeature<MockRuntime>();
if (feature != null)
{
    Debug.Log($"MockRuntime Enabled: {feature.enabled}");
}

// Iterate feature groups (Editor only)
var featureSets = OpenXRFeatureSetManager.FeatureSetsForBuildTarget(
    BuildTargetGroup.Standalone
);
foreach (var featureSet in featureSets)
{
    Debug.Log($"Feature Set ID: {featureSet.featureSetId}");
}

XR Interaction Toolkit

Package: com.unity.xr.interaction.toolkit (v3.3.1 for Unity 6000.3)

A high-level, component-based interaction system for VR and AR. Three foundational elements:

  1. Interactors -- Handle user input and initiate interactions
  2. Interactables -- Define objects users can interact with
  3. Interaction Manager -- Coordinates between interactors and interactables

Interaction States

StateDescription
HoverInteractable is a valid target; indicates intention
SelectUser input (button/trigger) triggers active interaction (grab)
FocusPersists after selection until another interactable is selected
ActivateSecondary contextual action mapped to additional controls

Update Loop

  1. Request valid target lists from Interactors
  2. Validate existing hover/focus/selection states
  3. Exit invalid states (OnSelectExiting, OnHoverExiting, OnFocusExiting)
  4. Enter new states (OnSelectEntering, OnHoverEntering, OnFocusEntering)

Interactors are always notified before Interactables for both processing and state changes.

Interactor Types

ComponentPurpose
XR Direct InteractorClose-range (touch/grab) interaction
XR Ray InteractorRay-based distance interaction
XR Poke InteractorPoking/touching interaction
Near-Far InteractorHybrid proximity/distance
XR Gaze InteractorEye-gaze based interaction
XR Socket InteractorSnap-point interaction
Climb Teleport InteractorClimbing locomotion

Interactable Types

ComponentPurpose
XR Grab InteractableObject grabbing and manipulation
XR Simple InteractableBasic interaction events
Climb InteractableClimbable surfaces
Teleportation AnchorFixed teleport destination
Teleportation AreaArea-based teleport target
Teleportation Multi-Anchor VolumeVolume with multiple anchors

XR Grab Interactable Movement Types

  • Instantaneous -- Sets Transform position/rotation every frame; lowest latency but can pass through colliders
  • Kinematic -- Updates kinematic Rigidbody during FixedUpdate; syncs physics with visuals
  • Velocity Tracking -- Sets Rigidbody velocity/angular velocity; prevents collision penetration but may lag

Interaction Strength

Interactors and Interactables report a normalized [0.0, 1.0] analog selection strength, processed after state changes.

Interaction Groups

A Group contains multiple member Interactors sorted by priority and only allows one Interactor in the Group to interact at a time. Supports nested Groups.

See skills/unity-xr/references/xr-toolkit.md for full API details.

Locomotion System

Locomotion Providers

ProviderDescription
Teleportation ProviderPoint-and-teleport movement
Snap Turn ProviderRotates user by fixed angles
Continuous Turn ProviderSmooth rotation over time
Continuous Move ProviderSmooth movement over time
Grab Move ProviderMoves user counter to controller movement
Two-Handed Grab Move ProviderDual-controller movement, rotation, scaling
Climb ProviderMovement while selecting Climb Interactables
Gravity ProviderGravitational effects with grounded state detection

Architecture

  • Locomotion Mediator -- Manages transformation requests; states: Idle, Preparing, Moving, Ended
  • XR Body Transformer -- Queues transformations applied each Update based on priority
  • XR Movable Body -- Wraps XR Origin with body-relative transformation

Transformations are applied sequentially based on ascending priority; same-priority transformations apply in queue order.

AR Foundation

Package: com.unity.xr.arfoundation (v6.3.3 for Unity 6000.3)

AR Foundation uses a two-package architecture:

  • Base Package -- Provides AR feature interfaces (non-functional alone)
  • Provider Plug-ins -- Platform-specific implementations

Supported Platforms

PlatformProvider Plug-in
AndroidGoogle ARCore XR Plug-in
iOSApple ARKit XR Plug-in
visionOSApple visionOS XR Plug-in
HoloLens 2OpenXR Plug-in
Meta QuestUnity OpenXR: Meta
Android XRUnity OpenXR: Android XR

Feature Subsystems

FeatureManager Component
Session ManagementARSession
Device TrackingARTrackedPoseDriver
CameraARCameraManager
Plane DetectionARPlaneManager
Image TrackingARTrackedImageManager
Face TrackingARFaceManager
Body TrackingARHumanBodyManager
Object TrackingARTrackedObjectManager
Point CloudsARPointCloudManager
Ray CastingARRaycastManager
AnchorsARAnchorManager
MeshingARMeshManager
Environment ProbesAREnvironmentProbeManager
OcclusionAROcclusionManager
Bounding Box DetectionARBoundingBoxManager
ParticipantsARParticipantManager

AR Gesture Interaction (XRI)

  • TouchscreenGestureInputController -- Maps screen touches to gesture events
  • ARTransformer -- Handles place, select, translate, rotate, and scale gestures
  • Screen Space input components feed into XRRayInteractor

Hand Tracking

Hand-tracking devices expose the HandTracking characteristic and CommonUsages.HandData feature:

Hand handData;
if (device.TryGetFeatureValue(CommonUsages.handData, out handData))
{
    // Get wrist bone
    Bone rootBone;
    if (handData.TryGetRootBone(out rootBone))
    {
        Vector3 wristPosition;
        rootBone.TryGetPosition(out wristPosition);
    }

    // Get finger bones (up to 21 bones per hand)
    List<Bone> fingerBones = new List<Bone>();
    if (handData.TryGetFingerBones(HandFinger.Index, fingerBones))
    {
        foreach (Bone bone in fingerBones)
        {
            Vector3 bonePosition;
            bone.TryGetPosition(out bonePosition);
        }
    }
}

Each Bone contains: position, orientation, parent/child references.

Controllers and Haptics

Input Device Access

using UnityEngine.XR;

// Get devices by role
var devices = new List<InputDevice>();
InputDevices.GetDevicesWithRole(InputDeviceRole.RightHanded, devices);

if (devices.Count > 0)
{
    var device = devices[0];

    // Read trigger button
    bool triggerPressed;
    if (device.TryGetFeatureValue(CommonUsages.triggerButton,
        out triggerPressed) && triggerPressed)
    {
        // Handle trigger press
    }

    // Read joystick axis
    Vector2 axis;
    if (device.TryGetFeatureValue(CommonUsages.primary2DAxis, out axis))
    {
        // Use axis.x, axis.y
    }
}

Common Input Usages

UsageTypeDescription
primary2DAxisVector2Thumbstick/touchpad
triggerfloatTrigger axis (0-1)
gripfloatGrip axis (0-1)
triggerButtonboolTrigger pressed
gripButtonboolGrip pressed
primaryButtonboolA/X button
secondaryButtonboolB/Y button
menuButtonboolMenu button
userPresenceboolUser wearing headset

Haptics

HapticCapabilities capabilities;
if (device.TryGetHapticCapabilities(out capabilities))
{
    if (capabilities.supportsImpulse)
    {
        uint channel = 0;
        float amplitude = 0.5f;  // 0-1
        float duration = 1.0f;   // seconds
        device.SendHapticImpulse(channel, amplitude, duration);
    }
}

Eye Tracking

Eyes eyeData;
if (device.TryGetFeatureValue(CommonUsages.eyesData, out eyeData))
{
    // Access left/right eye positions, gaze direction, blink amounts
}

Device Lifecycle

// Subscribe to connection events
InputDevices.deviceConnected += OnDeviceConnected;
InputDevices.deviceDisconnected += OnDeviceDisconnected;

// Always validate before use
if (device.isValid)
{
    // Safe to read features
}

Tracking Origin

var subsystems = new List<XRInputSubsystem>();
SubsystemManager.GetInstances<XRInputSubsystem>(subsystems);
if (subsystems.Count > 0)
{
    subsystems[0].TrySetTrackingOriginMode(TrackingOriginModeFlags.Floor);

    // Get play area boundary
    List<Vector3> boundaryPoints = new List<Vector3>();
    if (subsystems[0].TryGetBoundaryPoints(boundaryPoints))
    {
        // Points are floor-level, clockwise-ordered
    }
}

Common Patterns

Basic XR Rig Setup

  1. Add XR Origin to scene (provides camera offset and body tracking)
  2. Add XR Interaction Manager (single instance coordinates all interactions)
  3. Add Tracked Pose Driver to camera and controllers
  4. Add Interactors to controller GameObjects
  5. Add Interactables to interactive objects

Grab Object Pattern

// On the grabbable object:
// 1. Add Rigidbody
// 2. Add Collider
// 3. Add XR Grab Interactable component
// Configure Movement Type based on needs:
//   - Instantaneous: lowest latency, no physics
//   - Kinematic: physics-synced, moderate latency
//   - Velocity Tracking: full physics, potential lag

Recommended Grab Hierarchy

Grab Interactable (Rigidbody, XRGrabInteractable)
  ├── Visuals (MeshFilter, MeshRenderer)
  ├── Collider (BoxCollider, MeshCollider)
  └── Visual Feedback (Affordance providers)

XR Interaction Simulator

Use the XR Interaction Simulator component to test interactions in the Editor without physical hardware.

Anti-Patterns

  • Single Interaction Manager missing -- All Interactors and Interactables require a shared Interaction Manager. Forgetting it causes silent failures.
  • Using legacy Input Manager with OpenXR -- OpenXR requires the new Input System package. Legacy Input.GetAxis() will not work.
  • Skipping device validation -- Always check InputDevice.isValid before reading features; devices can disconnect at any time.
  • Ignoring Attach Ease In Time on sockets -- Socket interactor visual skips occur; set Attach Ease In Time to at least 0.15 to mitigate.
  • Mouse/World-space UI with XR providers -- Enabling XR Plug-in Providers breaks standard mouse and world-space UI. Use XR UI Input Module instead.
  • Not checking compute shader support -- On platforms without compute shaders, GPU-based features may fail silently. Check SystemInfo.supportsComputeShaders.
  • Teleportation without vignette -- Instant teleportation without a Tunneling Vignette Controller causes motion sickness.
  • Poke Interactor with UI Toolkit -- Known limitation; use Canvas-based UI with Tracked Device Graphic Raycaster instead.

Key API Quick Reference

ClassNamespacePurpose
XROriginUnity.XR.CoreUtilsCamera rig and tracking space
XRInteractionManagerUnityEngine.XR.Interaction.ToolkitCoordinates interactions
XRBaseInteractorUnityEngine.XR.Interaction.ToolkitBase interactor class
XRBaseInteractableUnityEngine.XR.Interaction.ToolkitBase interactable class
XRGrabInteractableUnityEngine.XR.Interaction.ToolkitGrabbable object
InputDeviceUnityEngine.XRPhysical XR device
InputDevicesUnityEngine.XRDevice discovery
CommonUsagesUnityEngine.XRStandard input feature names
OpenXRSettingsUnityEngine.XR.OpenXROpenXR configuration
ARSessionUnityEngine.XR.ARFoundationAR session management
ARPlaneManagerUnityEngine.XR.ARFoundationPlane detection
ARAnchorManagerUnityEngine.XR.ARFoundationSpatial anchors

Related Skills

  • unity-input -- Input System package, action maps, bindings
  • unity-graphics -- Rendering pipelines, shader considerations for XR

Additional Resources

What ships with it: 1 file

10.4 KB alongside SKILL.md

references/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.