共用方式為


子系統 — MRTK3

MRTK3 利用 Unity XR 子系統管理基礎結構來撰寫可延伸模組,以協助為語音和手部追蹤等功能提供跨平臺支援。 這些子系統會由 Unity 初始化和載入,以及和 等 XRMeshSubsystemXRInputSubsystem 現有 Unity 原生子系統。 請參閱 Unity 子系統運作方式的檔

哲學

在 MRTK v2 中,「服務」提供場景中大部分的功能。 他們會具現化物件、移動物件、更新場景階層等等。在 MRTK3 中,子系統不會明確修改場景。 MRTK3 子系統是資料、資訊或事件的模組化提供者,或為使用者執行計算。 如果場景中的某些專案應該變更或根據資料輸入採取行動,則必須有個別的場景視覺化檢視元件,才能對資料採取行動。 此分割可確保子系統對於場景變更不具破壞性,而且不會造成場景相關的副作用。

雖然 MRTK v2 在處理輸入時使用系統和服務,但 MRTK3 通常會使用 OpenXR 和 Unity 輸入系統進行跨平臺輸入。 不過,某些類型的資料尚未由輸入系統包裝。 在這些情況下,我們會透過子系統提供跨平臺介面。

MRTK 子系統生命週期

Unity 基礎結構隨附的子系統定義提供簡單的生命週期方法,例如 StartStopDestroy 。 我們會擴充此定義,以包含實用的「刻度」方法,例如 UpdateLateUpdateFixedUpdate 。 我們會 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;
}

Profiles

不要與 MRTK 2.x 的設定檔混淆,MRTK3 子系統設定檔是每個部署平臺資產,可定義要建立和啟動哪些子系統。

子系統設定檔,如 MRTK 專案設定檢視所示。

系統會建立並啟動已核取其對應核取方塊的子系統, MRTKLifecycleManager 並呼叫其生命週期方法。 您可以將不同的設定檔指派給不同的部署目標。

此處顯示的子系統取決於您已安裝的套件。 如果未安裝套件,則不會在此顯示與該套件相關聯的子系統,以及清單自動重新整理。

已預先提供 MRTKProfile 作為 MRTK v3 套件的一部分。 這是不可變的資產。 不過,如果您想要建立要執行的子系統自訂選取專案,您應該在專案內建立資產 MRTKProfile

建立您自己的 MRTK 子系統

設定

子系統可以指派組態物件來自訂其行為。

設定子系統

這些組態物件可從任何位置透過 XRSubsystemHelpers API 存取。

XRSubsystemHelpers.GetConfiguration<TConfig, TSubsystem>()

子系統會定義哪些組態類型與其在 中 MRTKSubsystemAttribute 相關。 此外,屬性也會定義數個中繼資料片段,以及實作提供者的具體類型。 例如,這是 MRTK Hands 匯總工具子系統所使用的屬性。

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

如同設定檔,會提供預設的組態資產。 它們不可變,而且必須複製至要編輯的專案。 您也可以透過資產建立功能表來建立新的資產。

新增資產建立功能表