<br />


Applicable XR devices  
This guidance helps you build experiences for these types of XR devices.  
[Learn about XR device types →](https://developer.android.com/develop/xr/devices)  
![](https://developer.android.com/static/images/develop/xr/xr-headsets-icon.svg) XR Headsets [](https://developer.android.com/develop/xr/devices#xr-headsets)  
![](https://developer.android.com/static/images/develop/xr/xr-glasses-icon.svg) Wired XR Glasses [](https://developer.android.com/develop/xr/devices#xr-glasses)  
[Learn about XR device types →](https://developer.android.com/develop/xr/devices)

<br />

This guide provides an overview of developing with Unity for Android XR. Android
XR works with the familiar tools and features you've come to expect from Unity,
and since Unity's Android XR support is built on top of OpenXR, many of the
features described in the [OpenXR Overview](https://developer.android.com/develop/xr/openxr) are also supported in Unity.

Follow this guide to learn about:

- Unity Support for Android XR
  - Unity XR basics
  - Developing and publishing apps for Android XR
  - Unity Packages for Android XR
    - Unity OpenXR: Android XR package
    - Android XR Extensions for Unity
    - Features and Compatibility Considerations
- Input and interaction

## Unity Support for Android XR

When you build Unity apps for Android XR, you can take advantage of the mixed
reality tools and capabilities in the [latest versions of Unity
6](https://unity.com/releases/editor/archive). This includes mixed reality templates that use the [XR
Interaction Toolkit](https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@latest), [AR Foundation](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@latest), and [OpenXR
Plugin](https://docs.unity3d.com/Packages/com.unity.xr.openxr@latest), to help you get started quickly. When building apps with
Unity for Android XR, we recommend the Universal Render Pipeline (URP) as your
render pipeline and Vulkan as your Graphics API. These features allow you to
take advantage of some of the [graphics features](https://unity.com/srp/universal-render-pipeline) of Unity, which
are only supported with Vulkan. Review the [project setup guide](https://developer.android.com/develop/xr/unity/setup) for more
information on how to configure these settings.

### Unity XR Basics

If you are new to Unity or XR development, you can refer to [Unity's XR
Manual](https://docs.unity3d.com/Manual/XR.html) to understand basic XR concepts and workflows. The XR
Manual contains information about:

- [XR provider plug-ins](https://docs.unity3d.com/Manual/xr-support-packages.html#plug-ins), including [Unity OpenXR: Android
  XR](https://developer.android.com/develop/xr/unity#unity-openxr) and the Android XR Extensions for Unity
- [XR support packages](https://docs.unity3d.com/Manual/xr-support-packages.html#support-packages) to add additional application-level features
- An [XR architecture guide](https://docs.unity3d.com/Manual/XRPluginArchitecture.html) that describes the Unity XR tech stack and XR subsystems
- [XR project set up](https://docs.unity3d.com/Manual/configuring-project-for-xr.html)
- [Building and running XR apps](https://docs.unity3d.com/Manual/xr-run.html)
- [XR graphics guidance](https://docs.unity3d.com/Manual/xr-graphics.html), including Universal Render Pipeline, stereo rendering, foveated rendering, multiview render regions, and VR frame timing
- [XR audio guidance](https://docs.unity3d.com/Manual/xr-audio.html), including support for [audio
  spatializers](https://docs.unity3d.com/Manual/VRAudioSpatializer.html)

### Develop and publish apps for Android

Unity provides in-depth documentation for developing, building, and publishing
for Android, covering topics including [Android permissions in
Unity](https://docs.unity3d.com/Manual/android-permissions-in-unity.html), [Android Build Settings](https://docs.unity3d.com/Manual/android-build-settings.html), [Building your
app for Android](https://docs.unity3d.com/Manual/android-BuildProcess.html), and [Delivering to Google
Play](https://docs.unity3d.com/Manual/android-distribution-google-play.html).

### Unity Packages for Android XR

There are two packages that provide support for building Unity apps for Android
XR. Both of these packages are XR provider plug-ins, which can be enabled
through Unity's XR Plug-in Management [package](https://docs.unity3d.com/Manual/com.unity.xr.management.html). The XR plug-in
manager adds Project Settings for managing and offering help with loading,
initialization, settings, and build support for XR plug-ins. To allow your app
to execute OpenXR features at runtime, the project must have these features
enabled through the plug-in manager.

This image shows an example of where you can enable these feature groups through
Unity's editor.

![Example of the unity xr plugin management
screen](https://developer.android.com/static/images/develop/xr/unity/index/xr-plugin-management.png)

#### Unity OpenXR Android XR

The [Unity OpenXR Android XR package](https://docs.unity3d.com/Packages/com.unity.xr.androidxr-openxr@latest/)
is an XR Plug-in to add Android XR support to Unity. This XR Plug-in provides
the majority of the Android XR support for Unity, and it enables Android XR
device support for [AR Foundation](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@latest) projects. AR Foundation is
designed for developers who want to create AR or mixed reality experiences. It
provides the interface for AR features, but doesn't implement any features
itself. The Unity OpenXR Android XR package provides the implementation. To get
started with this package view the package manual, which contains a Getting
Started guide.

#### Android XR Extensions for Unity

The [Android XR Extensions for Unity](https://github.com/android/android-xr-unity-package)
supplements the Unity OpenXR Android XR package, and it includes additional
features to help you build immersive experiences. It can be used alone or
together with the Unity OpenXR Android XR package.

To get started with this package, follow our [project setup guide](https://developer.android.com/develop/xr/unity/setup) or
[quickstart for importing Android XR Extensions for Unity](https://developer.android.com/develop/xr/unity/xr-extensions-quickstart).

#### Features and Compatibility Considerations

The following table describes the features supported by the Unity OpenXR:
Android XR package and the Android XR Extensions for Unity package, and it can
be used to determine which package contains the features you need and any
compatibility considerations.

| Feature | Unity OpenXR: Android XR feature string | Android XR Extensions for Unity feature string | Use cases and expected behavior |
|---|---|---|---|
| [AR Session](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.2/manual/features/session.html) | Android XR: AR Session - Feature settings include Optimize Buffer Discards (Vulkan) | Android XR (Extensions): Session Management - Feature settings include Subsampling (Vulkan) and URP SpaceWarp (Vulkan) | To use features from either package, you must enable the AR Session feature for that package. You can enable both feature sets at the same time; individual features will handle conflicts accordingly. |
| [Device tracking](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.2/manual/features/device-tracking.html) | N/A | N/A | Device tracking is used to track the device's position and rotation in physical space. The XR Origin [GameObject](https://docs.unity3d.com/6000.2/Documentation/Manual/class-GameObject.html) automatically handles device tracking and transforming trackables into Unity's coordinate system using its [XROrigin](https://docs.unity3d.com/Packages/com.unity.xr.core-utils@2.5/manual/xr-origin-reference.html) component and GameObject hierarchy with a Camera and [TrackedPoseDriver](https://docs.unity3d.com/Packages/com.unity.inputsystem@1.14/api/UnityEngine.InputSystem.XR.TrackedPoseDriver.html). |
| [Camera](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.2/manual/features/camera.html) | Android XR: AR Camera | N/A | This feature provides support for light estimation and full screen passthrough. |
| [Plane detection](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.2/manual/features/plane-detection.html) | Android XR: AR Plane | Android XR (Extensions): Plane | These two features are identical; use one or the other. Android XR (Extensions): Plane is included so that developers can use the Android XR (Extensions): Object Tracking and persistent anchors features without having to have a dependency on the Unity OpenXR Android XR package. In the future, Android XR (Extensions): Plane will be removed in favor of Android XR: AR Anchor. |
| [Object tracking](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.2/manual/features/object-tracking.html) | N/A | Android XR (Extensions): Object Tracking | This feature provides support for detecting and tracking objects in the physical environment, used in combination with a reference object library. |
| [Face tracking](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.2/manual/features/face-tracking.html) | Android XR: AR Face - XR_ANDROID_eye_tracking only - No face tracking | Android XR: Face Tracking - XR_ANDROID_face_tracking | Avatar eyes support is provided through the Android XR: AR Face feature. Access a user's facial expressions through the Android XR: Face Tracking feature. These two features can be used together. |
| [Ray casts](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.2/manual/features/raycasts.html) | Android XR: AR Raycast - Plane Anchor - Depth Anchor | N/A | This feature lets you cast a ray and calculate the intersection between that ray and plane trackables or depth trackables that are detected in the physical environment. |
| [Anchors](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.2/manual/features/anchors.html) | Android XR: AR Anchor | Android XR (Extensions): Anchor - Feature settings include persistence. | Both features include support for spatial anchors and plane anchors; use one feature or the other. For persistent anchors, use Android XR (Extensions): Anchor. In the future, Android XR (Extensions): Anchor will be removed and all Anchor features will be in Android XR: AR Anchor. |
| [Occlusion](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.2/manual/features/occlusion.html) | Android XR: AR Occlusion - Environment Depth | N/A | Occlusion allows mixed reality content in your app to appear hidden or partially obscured behind objects in the physical environment. |
| Performance Metrics | Android XR Performance Metrics | N/A | Use this feature to access performance metrics for Android XR devices. |
| [Composition Layers](https://docs.unity3d.com/Packages/com.unity.xr.compositionlayers@2.1/manual/usage-guide.html) | Composition Layer Support (OpenXR Plugin and XR Composition Layer are required) | Android XR: Passthrough Composition Layer - XR_ANDROID_composition_layer_passthrough_mesh | Use Unity's Composition Layer Support to create basic [composition layers](https://registry.khronos.org/OpenXR/specs/1.0-khr/html/xrspec.html#composition-layer-types) (e.g. quad, cylinder, projection). Android XR: Passthrough Composition Layer can be used to create a passthrough layer with a custom mesh, reading from Unity's [GameObject](https://docs.unity3d.com/6000.2/Documentation/Manual/class-GameObject.html). |
| [Foveated Rendering](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.15/manual/features/foveatedrendering.html) | Foveated Rendering (OpenXR Plugin is required) - Supports eye-tracked foveated rendering: the higher resolution area is centered where the user is looking, making it less apparent to the user | Foveation (Legacy) | Foveated rendering allows for speeding up rendering by lowering the resolution of areas in the user's peripheral vision. Unity's [foveated rendering feature](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.15/manual/features/foveatedrendering.html) is only supported for apps using URP and Vulkan. The Foveation (Legacy) feature in the Android XR Extensions for Unity also supports Built-in Render Pipeline and OpenGL ES. We recommend using Unity's [foveated rendering feature](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.15/manual/features/foveatedrendering.html) when possible, and note that both URP and Vulkan are recommended when building for Android XR. |
| [Unbounded Reference Space](https://docs.unity3d.com/ScriptReference/XR.TrackingOriginModeFlags.html) | N/A | Android XR: Unbounded Reference Space | This feature sets the [XRInputSubsystem](https://docs.unity3d.com/ScriptReference/XR.XRInputSubsystem.html) tracking origin mode to [Unbounded](https://docs.unity3d.com/ScriptReference/XR.TrackingOriginModeFlags.Unbounded.html). Unbounded indicates that the XRInputSubsystem tracks all InputDevices in relation to a world anchor, which can change. |
| [Environment Blend Mode](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.15/api/UnityEngine.XR.OpenXR.NativeTypes.XrEnvironmentBlendMode.html) | N/A | Environment Blend Mode | This feature lets you set the [XR Environment Blend Mode](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.15/api/UnityEngine.XR.OpenXR.Features.OpenXRFeature.html#UnityEngine_XR_OpenXR_Features_OpenXRFeature_SetEnvironmentBlendMode_UnityEngine_XR_OpenXR_NativeTypes_XrEnvironmentBlendMode_), which controls how virtual imagery blends with the real-world environment when passthrough is enabled. |

## Input and interaction

Android XR supports multi-modal natural input.
| **Note:** Hand input is the default.

In addition to hand and eye tracking, peripherals such as 6DoF controllers,
mouse, and physical keyboard are also supported. This means that apps for
Android XR are expected to support hand interaction, and it cannot be assumed
that all devices will come with controllers.

### Interaction Profiles

Unity uses [interaction profile](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.15/manual/project-configuration.html#interaction-profile) to manage how your XR
application communicates with various XR devices and platforms. These profiles
establish the expected inputs and outputs for different hardware configurations,
promoting compatibility and consistent functionality across a range of
platforms. By enabling interaction profiles, you can help ensure that your XR
application functions correctly with different devices, maintains consistent
input mapping, and has access to specific XR features. To set an interaction
profile:

1. Open the **Project Settings** window (menu: **Edit \> Project Settings**).
2. Click **XR Plug-in Management** to expand the plug-in section (if necessary).
3. Select **OpenXR** in the list of XR plug-ins.
4. In the **Interaction Profiles** section, select the **+** button to add a profile.
5. Select the profile to add from the list.

### Hand Interaction

Hand interaction ([`XR_EXT_hand_interaction`](https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_hand_interaction)) is provided by
the [OpenXR Plugin](https://docs.unity3d.com/Packages/com.unity.xr.openxr@latest), and you can expose the `<HandInteraction>`
device layout in the [Unity Input System](https://docs.unity3d.com/Packages/com.unity.inputsystem@1.14/manual/index.html) by enabling the [Hand
Interaction Profile](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.15/manual/features/handinteractionprofile.html). Use this interaction profile for hand
input supported by the four action poses defined by OpenXR: "pinch", "poke",
"aim", and "grip". If you need additional hand interaction or hand tracking
functionality, refer to [XR Hands](https://developer.android.com/develop/xr/unity#xr-hands) on this page.
| **Note:** Because this feature doesn't surface sensitive data, using the Hand Interaction profile doesn't require requesting any permissions.

### Eye Gaze Interaction

Eye gaze interaction ([`XR_EXT_eye_gaze_interaction`](https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_eye_gaze_interaction)) is
provided by the OpenXR Plugin, and you can use this layout to retrieve the eye
pose data (position and rotation) that the extension returns. [Read more about
eye gaze interaction in the OpenXR Input guide](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.15/manual/features/eyegazeinteraction.html).
| **Note:** Using the Eye Gaze Interaction profile requires the [`android.permission.EYE_TRACKING_FINE`](https://developer.android.com/develop/xr/get-started#permissions-xr) permission.

### Controller Interaction

Android XR supports the [Oculus Touch Controller Profile](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.13/manual/features/oculustouchcontrollerprofile.html) for
6DoF controllers. Both of these profiles are provided by the OpenXR Plugin.

### Mouse Interaction

The [Android XR Mouse Interaction Profile (`XR_ANDROID_mouse_interaction`)](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/AndroidXRMouseInteractionProfile)
is provided by the Android XR Extensions for Unity. It exposes an
`<AndroidXRMouse>` device layout in the [Unity Input System](https://docs.unity3d.com/Packages/com.unity.inputsystem@1.14/manual/index.html).

### Palm Pose Interaction

The OpenXR Plugin provides support for the [Palm Pose
Interaction](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.13/manual/features/palmposeinteraction.html) ([`XR_EXT_palm_pose`](https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_palm_pose)), which
exposes the `<PalmPose>` layout within the [Unity Input System](https://docs.unity3d.com/Packages/com.unity.inputsystem@1.14/manual/index.html).
Palm pose is not meant to be an alternative to extensions or packages that
perform hand tracking for more complex use cases; instead it can be used to
place app-specific visual content such as avatar visuals. The palm pose consists
of both palm position and orientation.

### XR Hands

The [XR Hands package](https://docs.unity3d.com/Packages/com.unity.xr.hands@1.6/manual/index.html) lets you access hand tracking data---using
[`XR_EXT_hand_tracking`](https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_hand_tracking) and
[`XR_FB_hand_tracking_aim`](https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_FB_hand_tracking_aim)---and provides a wrapper to convert
hand joint data from hand tracking to input poses. To use the features provided
by the XR Hands package, enable the **Hand Tracking Subsystem** and **Meta Hand
Tracking Aim OpenXR** features.

![Example showing how to enable hand
tracking](https://developer.android.com/static/images/develop/xr/unity/index/enable-hand-tracking.png)

The XR hands package can be useful if you need more granular hand pose or hand
joint data or when you need to work with custom gestures.

For more details, see Unity's [documentation for setting up XR Hands in your
project](https://docs.unity3d.com/Packages/com.unity.xr.hands@1.6/manual/project-setup/project-setup.html)
| **Note:** Using the XR Hands package requires the [`android.permission.HAND_TRACKING` permission](https://developer.android.com/develop/xr/permissions).

### Face Tracking Confidence Regions

The `XR_ANDROID_face_tracking` extension provides confidence values for three
facial regions: upper left, upper right, and lower face. These values, ranging
from 0 (no confidence) to 1 (highest confidence), indicate the accuracy of the
face tracking for each region.

You can use these confidence values to progressively disable blendshapes or apply
visual filters (like blurring) to the corresponding face region. For a basic
deactivate blendshapes in the corresponding face region.

The "lower face" area represents everything under the eyes, including the mouth,
chin, cheek, and nose. The two upper regions include the eyes and brow area on
the left and right sides of the face.

The following C# code snippet demonstrates how to access and use the confidence
data in a Unity script:  

    using UnityEngine;
    using Google.XR.Extensions;

    public class FaceTrackingConfidence : MonoBehaviour
    {
        void Update()
        {
          if (!XRFaceTrackingFeature.IsFaceTrackingExtensionEnabled.HasValue)
          {
            DebugTextTopCenter.text = "XrInstance hasn't been initialized.";
            return;
          }
          else if (!XRFaceTrackingFeature.IsFaceTrackingExtensionEnabled.Value)
          {
            DebugTextTopCenter.text = "XR_ANDROID_face_tracking is not enabled.";
            return;
          }

          for (int x = 0; x < _faceManager.Face.ConfidenceRegions.Length; x++)
          {
            switch (x)
            {
              case (int)XRFaceConfidenceRegion.Lower:
                regionText = "Bottom";
                break;
              case (int)XRFaceConfidenceRegion.LeftUpper:
                regionText = DebugTextConfidenceLeft;
                break;
              case (int)XRFaceConfidenceRegion.RightUpper:
                regionText = DebugTextConfidenceRight;
                break;
            }
        }
    }

For more information, see the [Android XR Extensions for Unity documentation](https://github.com/android/android-xr-unity-package).

### Choose a way to render hands

Android XR supports two ways of rendering hands: a hand mesh and a prefab
visualizer.

#### Hand mesh

The [Android XR Unity package](https://developer.android.com/develop/xr/unity#android-xr-extensions-unity) contains a Hand Mesh feature that provides
access to the [`XR_ANDROID_hand_mesh extension`](https://developer.android.com/develop/xr/unity/reference/class/Google/XR/Extensions/XRHandMeshFeature). The Hand Mesh
feature provides meshes for the user's hands. The hand mesh contains vertices of
triangles that represent the geometry of a hand. This feature is intended to be
used to provide a personalized mesh representing the real geometry of the user's
hands for visualization.

#### XR Hands prefab

The [XR Hands package](https://docs.unity3d.com/Packages/com.unity.xr.hands@1.6/manual/index.html) contains a sample called [Hands
visualizer](https://docs.unity3d.com/Packages/com.unity.xr.hands@1.1/manual/index.html), which contains fully rigged left and right hands
for rendering context-appropriate representation of the user's hands.

### System gestures

Android XR includes a system gesture to open a menu for users to go back, open
the launcher or get an overview of running apps. The user can activate this
system menu by using a dominant-hand pinch.  
Alas, your browser doesn't support HTML5 video. That's OK! You can still [download the
video](https://developer.android.com/static/images/develop/xr/unity/index/pinch-gesture.mp4) and watch it with a video player.

When the user is interacting with the system navigation menu, the application
will only respond to head tracking events. The XR Hands package can detect when
a user performs specific actions such as interacting with this system navigation
menu. Checking for `AimFlags`, `SystemGesture`, and `DominantHand` lets you know
when this system action is performed. For more information on `AimFlags`, refer
to Unity's [Enum MetaAimFlags documentation](https://docs.unity3d.com/Packages/com.unity.xr.hands@1.1/api/UnityEngine.XR.Hands.MetaAimFlags.html).

### XR Interaction Toolkit

The [XR Interaction Toolkit package](https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@latest) is a high-level,
component-based, interaction system for creating VR and AR experiences. It
provides a framework that makes 3D and UI interactions available from Unity
input events. It supports interaction tasks including haptic feedback, visual
feedback, and locomotion.

*** ** * ** ***

OpenXR™ and the OpenXR logo are trademarks owned
by The Khronos Group Inc. and are registered as a trademark in China,
the European Union, Japan and the United Kingdom.