Files
adriadri6972 d3d9c5f833 upload project
2025-07-31 15:21:08 +02:00

59 lines
4.4 KiB
Markdown

---
uid: arfoundation-implement-a-provider
---
# Implement a provider
To implement a provider for one or more of the subsystems in this package (for example, say you are a hardware manufacturer for a new AR device), Unity recommends that your implementation inherit from that subsystem's base class. These base class types follow a naming convention of **XR<Feature>Subsystem**, and they are found in the `UnityEngine.XR.ARSubsystems` namespace. Each subsystem base class has a nested abstract class called `Provider`, which is the primary interface you must implement for each subsystem you plan to support.
Subsystem implementations should be independent from each other. For example, your implementation of the [XRPlaneSubsystem](xref:UnityEngine.XR.ARSubsystems.XRPlaneSubsystem) should have the same behavior whether or not your [XRPointCloudSubsystem](xref:UnityEngine.XR.ARSubsystems.XRPointCloudSubsystem) implementation is also active in a user's scene.
## Register a subsystem descriptor
Each subsystem type has a corresponding subsystem descriptor type. Your provider should create and register a subsystem descriptor instance with Unity's [SubsystemManager](https://docs.unity3d.com/ScriptReference/SubsystemManager.html) to enable runtime discovery and activation of subsystems. To register your subsystem descriptor, include a static void method with the `[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]` attribute as shown in the example below, and in it call the type-appropriate registration method for the type of subsystem descriptor you are registering.
```csharp
// This class defines a Raycast subsystem provider
class MyRaycastSubsystem : XRRaycastSubsystem
{
class MyProvider : Provider
{
// ...
// XRRaycastSubsystem.Provider is a nested abstract class for you
// to implement
// ...
}
// This method registers the subsystem descriptor with the SubsystemManager
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void RegisterDescriptor()
{
// In this case XRRaycastSubsystemDescriptor provides a registration
// helper method. See each subsystem descriptor's API documentation
// for more information.
XRRaycastSubsystemDescriptor.Register(new XRImageTrackingSubsystemDescriptor.Cinfo
{
providerType = typeof(MyProvider),
subsystemTypeOverride = typeof(MyRaycastSubsystem),
// ...
// You populate all required fields based on the details of
// your provider implementation
// ...
});
}
}
```
### Native plug-ins
Some XR subsystems, notably including the mesh subsystem, are not defined in the `ARSubsystems` namespace. These subsystems conform to Unity's **native plug-in interface**, and their descriptors cannot be registered via C#. For more information about native plug-ins, see the [Unity XR SDK documentation](https://docs.unity3d.com/Manual/xr-sdk.html).
## Implement a tracking subsystem
Each tracking subsystem defines a method called [GetChanges](xref:UnityEngine.XR.ARSubsystems.TrackingSubsystem`4.GetChanges(Unity.Collections.Allocator)), which reports all added, updated, and removed trackables since the previous call to [GetChanges](xref:UnityEngine.XR.ARSubsystems.TrackingSubsystem`4.GetChanges(Unity.Collections.Allocator)). You are required to implement the [GetChanges](xref:UnityEngine.XR.ARSubsystems.TrackingSubsystem`4.GetChanges(Unity.Collections.Allocator)) method and should expect it to be called once per frame. Your provider must not update or remove a trackable without adding it first, nor update a trackable after it has been removed.
## Implement an XR Loader
An `XRLoader` is responsible for creating and destroying subsystem instances based on the settings found in **Project Settings** > **XR Plug-in Management**. All provider plug-ins must implement an `XRLoader`. For more information on authoring an `XRLoader`, see the [XR Plug-in Management provider documentation](https://docs.unity3d.com/Packages/com.unity.xr.management@latest?subfolder=/manual/Provider.html).
Example `XRLoader` implementations can be found in existing provider plug-ins, such as the [ARCoreLoader](xref:UnityEngine.XR.ARCore.ARCoreLoader) and [ARKitLoader](xref:UnityEngine.XR.ARKit.ARKitLoader). Install these packages to view their source code.