子系统 - MRTK3

MRTK3 利用 Unity XR 子系统管理基础结构编写可扩展模块,帮助为语音和手部跟踪等功能提供跨平台支持。 这些子系统与现有的 Unity 本机子系统(如 XRMeshSubsystemXRInputSubsystem)共同由 Unity 初始化和加载。 请参阅有关 Unity 子系统工作原理的文档

原则

在 MRTK v2 中,“服务”提供了场景本身的大部分功能。 它们实例化对象、移动对象、更新场景层次结构等。在 MRTK3 中,子系统不会显式修改场景。 MRTK3 子系统模块化地提供数据、信息或事件,或者为最终用户执行计算。 如果应根据数据输入更改或操作场景中的某些内容,则必须使用独立的基于场景的可视化工具组件来操作数据。 这种拆分确保子系统在场景更改方面是非破坏性的,并且不会导致与场景相关的副作用。

尽管 MRTK v2 大量使用系统和服务来处理输入,但 MRTK3 通常使用 OpenXR 和 Unity 输入系统进行跨平台输入。 但是,输入系统尚未包装某些类型的数据。 在这些情况下,通过子系统提供跨平台接口。

MRTK 子系统生命周期

Unity 基础结构中包含的子系统定义提供了简单的生命周期方法,例如 StartStopDestroy。 我们扩展了这个定义,加入了很有帮助的“tick”方法,例如 UpdateLateUpdateFixedUpdateMRTKLifecycleManager 管理实现生命周期接口的子系统。 这个生命周期管理器是子系统基础结构中包含的唯一 MonoBehaviour;它可以放置在场景中的任意位置,但通常将其放置在 Rig 上的某个位置。

查询

查询子系统实现简单且高效。

// Gets the first valid implementation of T that is started and running.
T mySubsystem = XRSubsystemHelpers.GetFirstRunningSubsystem<T>();

// Gets the first valid implementation of T, even if it hasn't been started.
T mySubsystem = XRSubsystemHelpers.GetFirstSubsystem<T>();

// If multiple implementations of T are loaded, get all of them.
List<T> allOfThem = new List<T>();
GetAllRunningSubsystemsNonAlloc<T>(allOfThem);

描述符

子系统的不同实现可以具有不同的功能。 例如,HandsSubsystem 的不同实现可以指定各自报告物理数据或合成数据的能力。 此功能信息存储在子系统描述符中,并且可以针对任何给定的实现查询此功能信息。

// Get the first running hands subsystem.
var handsSubsystem = XRSubsystemHelpers.GetFirstRunningSubsystem<HandsSubsystem>();

// If we found one...
if (handsSubsystem != null)
{
    // Read the capability information off the implementation's descriptor.
    bool isPhysicalData = handsSubsystem.subsystemDescriptor.IsPhysicalData;
}

档案

不要与 MRTK 2.x 的配置文件混淆,MRTK3 子系统配置文件是每部署平台的资产,该资产定义创建和启动哪些子系统。

Subsystem profiles, as shown in the MRTK project settings view.

已勾选各自相应复选框的子系统将由 MRTKLifecycleManager 创建并启动,并调用各自的生命周期方法。 不同的配置文件可以分配给不同的部署目标。

此处显示的子系统由安装的包决定。 如果未安装包,则与该包关联的子系统不会在此处显示,并且列表会自动刷新。

预制的 MRTKProfile 作为 MRTK v3 包的一部分提供。 它是不可变资产。 但是,如果要创建可供运行的自定义子系统选项,你应在项目中创建 MRTKProfile 资产。

Create your own MRTK subsystems

配置

可以为子系统分配配置对象来自定义其行为。

Configuring a subsystem

可以通过 XRSubsystemHelpers API 从任意位置访问这些配置对象。

XRSubsystemHelpers.GetConfiguration<TConfig, TSubsystem>()

子系统在其 MRTKSubsystemAttribute 中定义与其相关的配置类型。 此外,该属性还定义了多条元数据,以及已实现的提供者的具体类型。 例如,这是 MRTK Hands Aggregator 子系统使用的属性。

[MRTKSubsystem(
        Name = "com.microsoft.mixedreality.hands",
        DisplayName = "MRTK Hands Aggregator Subsystem",
        Author = "Microsoft",
        ProviderType = typeof(MRTKAggregator),
        SubsystemTypeOverride = typeof(MRTKHandsAggregatorSubsystem),
        ConfigType = typeof(MRTKHandsAggregatorConfig))]

与配置文件相同,提供了默认配置资产。 它们是不可变的,必须复制到项目中才能进行编辑。 你也可以通过资产创建菜单创建新资产。

New asset creation menu