Podsystemy — MRTK3
MRTK3 korzysta z infrastruktury zarządzania podsystemem XR aparatu Unity do pisania rozszerzalnych modułów, które mogą pomóc zapewnić obsługę międzyplatformową dla funkcji, takich jak mowę i śledzenie rąk. Te podsystemy są inicjowane i ładowane przez aparat Unity wraz z istniejącymi podsystemami natywnymi aparatu Unity, takimi jak XRMeshSubsystem
i XRInputSubsystem
. Zapoznaj się z dokumentacją dotyczącą sposobu działania podsystemów aparatu Unity.
Filozofii
W zestawie narzędzi MRTK w wersji 2 "usługi" zapewniały wiele funkcji w samej scenie. Tworzyłyby wystąpienia obiektów, przenosiły obiekty, aktualizowały hierarchię scen itp. W narzędziu MRTK3 podsystemy nie modyfikują jawnie sceny. Podsystemy MRTK3 to modułowi dostawcy danych, informacji lub zdarzeń lub wykonywania obliczeń dla użytkowników końcowych. Jeśli coś w scenie powinno się zmienić lub działać na podstawie danych wejściowych, musi istnieć oddzielny składnik wizualizatora oparty na scenie, aby działał na danych. Ten podział zapewnia, że podsystemy nie są destrukcyjne w odniesieniu do zmian sceny i nie powodują efektów ubocznych związanych ze sceną.
Podczas gdy mrTK v2 używane systemy i usługi liberalnie do przetwarzania danych wejściowych, MRTK3 zazwyczaj używa openXR i systemu wprowadzania unity dla danych wejściowych międzyplatformowych. Jednak niektóre typy danych nie są jeszcze opakowane przez system wejściowy. W takich przypadkach udostępniamy interfejsy międzyplatformowe za pośrednictwem naszych podsystemów.
Cykl życia podsystemu MRTK
Definicje podsystemu dołączone do infrastruktury aparatu Unity oferują proste metody cyklu życia, takie jak Start
, Stop
i Destroy
. Rozszerzamy tę definicję tak, aby zawierała przydatne metody "znaczniki", takie jak Update
, LateUpdate
i FixedUpdate
. Zarządzamy MRTKLifecycleManager
podsystemami, które implementują interfejs cyklu życia. Ten menedżer cyklu życia jest jedynym rozwiązaniem MonoBehaviour zaangażowanym w architekturę podsystemu; można to umieścić w dowolnym miejscu w scenie, ale mamy tendencję do opuszczenia go gdzieś na Rig.
Wykonywanie zapytania
Wykonywanie zapytań dotyczących implementacji podsystemu jest proste i wydajne.
// 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);
Deskryptory
Różne implementacje podsystemu mogą mieć różne możliwości. Na przykład różne implementacje obiektu HandsSubsystem
mogą określać ich możliwości raportowania danych fizycznych lub syntetyzowanych danych. Te informacje o możliwości są przechowywane w deskryptorze podsystemu i mogą być odpytywane pod kątem dowolnej danej implementacji.
// 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;
}
Profile
Nie należy mylić z profilami podsystemu MRTK 2.x, profile podsystemu MRTK3 to zasób dla platformy wdrażania, który definiuje, które podsystemy są tworzone i uruchamiane.
Podsystemy, które mają odpowiednie pole wyboru, zostaną utworzone i uruchomione przez MRTKLifecycleManager
program i będą miały wywoływane metody cyklu życia. Różne profile można przypisać do różnych celów wdrażania.
Pokazane tutaj podsystemy są określane przez zainstalowane pakiety. Jeśli pakiet nie jest zainstalowany, podsystemy skojarzone z tym pakietem nie będą wyświetlane w tym miejscu, a lista zostanie automatycznie odświeżona.
Pakiet MRTK v3 jest dostarczany wstępnie MRTKProfile
. Jest to niezmienny zasób. Jeśli jednak chcesz utworzyć niestandardowy wybór podsystemów do uruchomienia, należy utworzyć zasób MRTKProfile
w projekcie.
Konfiguracja
Podsystemy można przypisywać do obiektów konfiguracji w celu dostosowania ich zachowania.
Te obiekty konfiguracji są dostępne z dowolnego miejsca za pośrednictwem interfejsu XRSubsystemHelpers
API.
XRSubsystemHelpers.GetConfiguration<TConfig, TSubsystem>()
Podsystemy definiują, który typ konfiguracji ma zastosowanie do nich w ich MRTKSubsystemAttribute
pliku . Wraz z tym atrybut definiuje również kilka elementów metadanych wraz z konkretnymi typami zaimplementowanego dostawcy. Na przykład jest to atrybut używany przez podsystem agregatora rąk zestawu narzędzi MRTK.
[MRTKSubsystem(
Name = "com.microsoft.mixedreality.hands",
DisplayName = "MRTK Hands Aggregator Subsystem",
Author = "Microsoft",
ProviderType = typeof(MRTKAggregator),
SubsystemTypeOverride = typeof(MRTKHandsAggregatorSubsystem),
ConfigType = typeof(MRTKHandsAggregatorConfig))]
Podobnie jak w przypadku profilów, są udostępniane domyślne zasoby konfiguracji. Są one niezmienne i muszą zostać zduplikowane do projektu, aby można je było edytować. Nowy zasób można również utworzyć za pomocą menu tworzenia zasobu.