子系統 — MRTK3
MRTK3 利用 Unity XR 子系統管理基礎結構來撰寫可延伸模組,以協助為語音和手部追蹤等功能提供跨平臺支援。 這些子系統會由 Unity 初始化和載入,以及和 等 XRMeshSubsystem
XRInputSubsystem
現有 Unity 原生子系統。 請參閱 Unity 子系統運作方式的檔。
哲學
在 MRTK v2 中,「服務」提供場景中大部分的功能。 他們會具現化物件、移動物件、更新場景階層等等。在 MRTK3 中,子系統不會明確修改場景。 MRTK3 子系統是資料、資訊或事件的模組化提供者,或為使用者執行計算。 如果場景中的某些專案應該變更或根據資料輸入採取行動,則必須有個別的場景視覺化檢視元件,才能對資料採取行動。 此分割可確保子系統對於場景變更不具破壞性,而且不會造成場景相關的副作用。
雖然 MRTK v2 在處理輸入時使用系統和服務,但 MRTK3 通常會使用 OpenXR 和 Unity 輸入系統進行跨平臺輸入。 不過,某些類型的資料尚未由輸入系統包裝。 在這些情況下,我們會透過子系統提供跨平臺介面。
MRTK 子系統生命週期
Unity 基礎結構隨附的子系統定義提供簡單的生命週期方法,例如 Start
、 Stop
和 Destroy
。 我們會擴充此定義,以包含實用的「刻度」方法,例如 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;
}
Profiles
不要與 MRTK 2.x 的設定檔混淆,MRTK3 子系統設定檔是每個部署平臺資產,可定義要建立和啟動哪些子系統。
系統會建立並啟動已核取其對應核取方塊的子系統, MRTKLifecycleManager
並呼叫其生命週期方法。 您可以將不同的設定檔指派給不同的部署目標。
此處顯示的子系統取決於您已安裝的套件。 如果未安裝套件,則不會在此顯示與該套件相關聯的子系統,以及清單自動重新整理。
已預先提供 MRTKProfile
作為 MRTK v3 套件的一部分。 這是不可變的資產。 不過,如果您想要建立要執行的子系統自訂選取專案,您應該在專案內建立資產 MRTKProfile
。
設定
子系統可以指派組態物件來自訂其行為。
這些組態物件可從任何位置透過 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))]
如同設定檔,會提供預設的組態資產。 它們不可變,而且必須複製至要編輯的專案。 您也可以透過資產建立功能表來建立新的資產。