This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
ARPlusSystem/ARPlusSystem-250418/Library/PackageCache/com.unity.xr.arsubsystems@4.../Documentation~/index.md

112 lines
5.1 KiB
Markdown
Raw Normal View History

---
uid: arsubsystems-manual
---
# About AR Subsystems
A [subsystem](xref:UnityEngine.Subsystem) is a platform-agnostic interface for surfacing different types of functionality and data. The AR-related subsystems are defined in this package and use the namespace `UnityEngine.XR.ARSubsystems`. This package only provides the interface for various subsystems. Implementations for these subsystems (called "providers") are typically provided as separate packages or plug-ins. These are called "provider implementations".
This package provides interfaces for the following subsystems:
- [Session](session-subsystem.md)
- [Anchors](anchor-subsystem.md)
- [Raycasting](raycasting-subsystem.md)
- [Camera](camera-subsystem.md)
- [Plane Detection](plane-subsystem.md)
- [Depth](depth-subsystem.md)
- [Image Tracking](image-tracking.md)
- [Face Tracking](face-tracking.md)
- [Environment Probes](environment-probe-subsystem.md)
- [Object Tracking](object-tracking.md)
- [Body Tracking](xref:UnityEngine.XR.ARSubsystems.XRHumanBodySubsystem)
- [Occlusion](occlusion-subsystem.md)
- [Meshes](mesh-subsystem.md)
## Installing AR Subsystems
AR Subsystems is a dependency of platform-specific packages which use one or more of the subsystems defined within it. To use AR Subsystems, you must also install at least one of these platform-specific AR packages:
- ARCore XR Plug-in
- ARKit XR Plug-in
- Magic Leap XR Plug-in
- Windows XR Plug-in
## Using AR Subsystems
All subsystems have the same lifecycle: they can be created, started, stopped, and destroyed. Each subsystem has a corresponding `SubsystemDescriptor`, which describes the capabilities of a particular provider. Use the `SubsystemManager` to enumerate the available subsystems of a particular type. When you have a valid subsystem descriptor, you can `Create()` the subsystem. This is the only way to construct a valid subsystem.
### Example: picking a plane subsystem
This example iterates through all the `XRPlaneSubsystemDescriptor`s to look for one which supports a particular feature, then creates it. You can only have one subsystem per platform.
```csharp
XRPlaneSubsystem CreatePlaneSubsystem()
{
// Get all available plane subsystems
var descriptors = new List<XRPlaneSubsystemDescriptor>();
SubsystemManager.GetSubsystemDescriptors(descriptors);
// Find one that supports boundary vertices
foreach (var descriptor in descriptors)
{
if (descriptor.supportsBoundaryVertices)
{
// Create this plane subsystem
return descriptor.Create();
}
}
return null;
}
```
When created, you can `Start` and `Stop` the subsystem. The exact behavior of `Start` and `Stop` varies by subsystem, but generally corresponds to "start doing work" and "stop doing work". A subsystem can be started and stopped multiple times. To completely destroy the subsystem instance, call `Destroy` on the subsystem. It is not valid to access a subsystem after it has been destroyed.
```csharp
var planeSubsystem = CreatePlaneSubsystem();
if (planeSubsystem != null)
{
// Start plane detection
planeSubsystem.Start();
}
// Some time later...
if (planeSubsystem != null)
{
// Stop plane detection. This doesn't discard already detected planes.
planeSubsystem.Stop();
}
// When shutting down the AR portion of the app:
if (planeSubsystem != null)
{
planeSubsystem.Destroy();
planeSubsystem = null;
}
```
Refer to the subsystem-specific documentation list above for more details about each subsystem this package provides.
## Implementing an AR subsystem
If you are implementing one of the AR Subsystems in this package (for example, you are a hardware manufacturer for a new AR device), you need to implement a concrete instance of the relevant abstract base class this package provides. Those types are typically named `XR<feature>Subsystem`.
Each subsystem has a nested class called `IProvider`. This is the primary interface you must implement for each subsystem you plan to support.
### Tracking subsystems
A "tracking" subsystem is any subsystem that detects and tracks something in the physical environment (for example, plane tracking and image tracking). The thing that the tracking subsystem tracks is called a "trackable". For example, the plane subsystem detects planes, so a plane is a trackable.
Each tracking subsystem requires you to implement a method called `GetChanges`. This method retrieves data about the trackables it manages. Each trackable can be uniquely identified by a `TrackableId`, a 128-bit GUID (Globally Unique Identifier). A trackable can be added, updated, or removed. It's an error to update or remove a trackable that hasn't been added yet. Likewise, a trackable can't be removed without having been added, nor updated if it hasn't been added or was already removed.
`GetChanges` should report all added, updated, and removed trackables since the previous call to `GetChanges`. You should expect `GetChanges` to be called once per frame.
## Technical details
### Requirements
This version of AR Subsystems is compatible with the following versions of the Unity Editor:
* 2020.3
* 2021.1
* 2021.2