子系统 - MRTK3
MRTK3 利用 Unity XR 子系统管理基础结构编写可扩展模块,帮助为语音和手部跟踪等功能提供跨平台支持。 这些子系统与现有的 Unity 本机子系统(如 XRMeshSubsystem
和 XRInputSubsystem
)共同由 Unity 初始化和加载。 请参阅有关 Unity 子系统工作原理的文档。
原则
在 MRTK v2 中,“服务”提供了场景本身的大部分功能。 它们实例化对象、移动对象、更新场景层次结构等。在 MRTK3 中,子系统不会显式修改场景。 MRTK3 子系统模块化地提供数据、信息或事件,或者为最终用户执行计算。 如果应根据数据输入更改或操作场景中的某些内容,则必须使用独立的基于场景的可视化工具组件来操作数据。 这种拆分确保子系统在场景更改方面是非破坏性的,并且不会导致与场景相关的副作用。
尽管 MRTK v2 大量使用系统和服务来处理输入,但 MRTK3 通常使用 OpenXR 和 Unity 输入系统进行跨平台输入。 但是,输入系统尚未包装某些类型的数据。 在这些情况下,通过子系统提供跨平台接口。
MRTK 子系统生命周期
Unity 基础结构中包含的子系统定义提供了简单的生命周期方法,例如 Start
、Stop
和 Destroy
。 我们扩展了这个定义,加入了很有帮助的“tick”方法,例如 Update
、LateUpdate
和 FixedUpdate
。 MRTKLifecycleManager
管理实现生命周期接口的子系统。 这个生命周期管理器是子系统基础结构中包含的唯一 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 子系统配置文件是每部署平台的资产,该资产定义创建和启动哪些子系统。
已勾选各自相应复选框的子系统将由 MRTKLifecycleManager
创建并启动,并调用各自的生命周期方法。 不同的配置文件可以分配给不同的部署目标。
此处显示的子系统由安装的包决定。 如果未安装包,则与该包关联的子系统不会在此处显示,并且列表会自动刷新。
预制的 MRTKProfile
作为 MRTK v3 包的一部分提供。 它是不可变资产。 但是,如果要创建可供运行的自定义子系统选项,你应在项目中创建 MRTKProfile
资产。
配置
可以为子系统分配配置对象来自定义其行为。
可以通过 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))]
与配置文件相同,提供了默认配置资产。 它们是不可变的,必须复制到项目中才能进行编辑。 你也可以通过资产创建菜单创建新资产。