共用方式為


互動器架構 - MRTK3

MRTK 是以 Unity 的 XR 互動工具組所提供的一組互動專案為基礎。 混合實境功能,例如清楚表達的手部追蹤、注視和捏合,需要比 XRI 預設提供的集合更詳盡的互動專案。 MRTK 會定義新的互動器介面,並依輸入形式分類,以及對應的實作。

摘要和檢閱

對於 XRI 新手的開發人員,建議您先檢閱 Unity 的 XRI 架構檔。 MRTK 互動專案是現有 XRI 互動專案或 XRI 互動器介面實作的子類別。 請參閱 Unity 的互動器架構檔,這些架構也適用于 MRTK。

XRI 的良好公民

自訂 MRTK 互動程式在預設 XRI 互動器介面方面的行為良好;從 XRI 系統的觀點來看,它們與「虛名」互動者不相同。 反值也是 true;在 MRTK 中建置進階互動專案時,預設的 XRI 互動專案仍適用于基本暫留並選取。 這是 MRTK 努力與現有 XRI 專案完全相容的一部分。 如果您有 XRI 應用程式,MRTK 可互動和 UI 控制項將會與現有的「vanilla」 XRI 設定搭配使用。

輸入形式抽象概念

輸入裝置、執行互動的互動器,以及它們產生的互動事件全都以架構方式隔離在 XRI 中。 此隔離對於 MRTK3 中的輸入抽象策略很重要,並可讓我們撰寫在所有內容中運作良好的跨平臺和跨裝置互動。

從 MRTK v2,程式碼互動是特定輸入類型或裝置特有的常見直覺。 許多開發人員習慣撰寫特別回應近抓取、遠光或其他特定輸入類型的互動。

雖然 MRTK3 仍然允許區分和偵測個別輸入模式,但特定個別輸入類型的硬式編碼互動會以人工方式限制,並減少互動的彈性。 如需詳細資訊,請參閱 可互動架構檔,但互動專案的關鍵在於它們通常不需要與輸入裝置對應 1:1。

AttachTransform 和 Control 的反轉

MRTK v2 在 「移動邏輯」中做為 、 Slider 等的一部分 ObjectManipulator ,現在是互動者本身的責任。 互動程式現在會控制其 attachTransform,以定義特定類型的操作行為。 一個不再需要在輸入形式之間差異的可互動性上撰寫複雜的互動邏輯;相反地,您的統一操作邏輯可以接聽 attachTransform 的姿勢,而不論輸入形式或裝置正在驅動它。

例如, GrabInteractorattachTransform 位於手/控制器上的抓取點。 XRRayInteractorattachTransform 位於光線結尾的命中點。 CanvasProxyInteractorattachTransform 位於滑鼠按一下的位置。 針對所有這些不同的互動者,可互動 的不需要關心互動器的類型,才能適當地回應操作。

可互動的查詢 attachTransform ,無論互動器類型為何,都可以處理每個 attachTransform 相同的查詢。

這種方法對於與現有 XRI 互動者相容,以及未來針對尚未開發的輸入形式進行互動證明非常重要。 如果引進新的輸入法,如果新的互動器產生有效且行為 attachTransform 良好的 ,您就不需要改變現有的可互動性。

因此,在原理上是 attachTransform 互動邏輯。 對於任何自訂互動,請一律偏好使用新的 attachTransform 邏輯撰寫新的互動器,而不是重寫或擴充可互動性,以針對新的互動進行自訂。 如此一來,所有現有的互動專案都可以享有新互動的優點,而不只是您重寫或擴充的互動。

XRControllers 和輸入系結

大部分的互動專案不會直接系結至輸入動作。 大部分衍生自 XRBaseControllerInteractor ,其需要 XRController 階層中互動器上方的 。 系 XRController 結至輸入動作,然後將相關的動作傳播 (選取,依此類推,) 向下傳播至所有附加的互動專案。

不過,某些互動者可能需要特殊輸入系結或未提供的其他輸入 XRController 。 在這些情況下,互動者可以選擇直接系結至自己的唯一輸入動作,或甚至使用其他非輸入系統來源來進行互動邏輯。 XRI 基類偏好接 XRController 聽 的系結,但可以覆寫這些行為,以使用外部或替代的輸入來源。

介面

XRI 會定義基本 IXRInteractorIXRHoverInteractorIXRSelectInteractorIXRActivateInteractor 。 MRTK 會定義互動專案的其他介面。 有些公開有關 MRTK 特定互動的其他資訊,而其他則只是為了分類和識別。 這些介面全都位於 Core 套件內,而實作則位於其他套件中,包括 Input

重要

當您需要篩選特定類型的互動時,雖然這些介面很有用,但建議您 不要 硬式撰寫互動的程式碼,以特別接聽這些介面。 在每個情況下,一律將喜好設定提供給泛型 XRI isSelectedisHovered,而不是任何互動特定的介面

除非必要,否則您不應該在互動中參考這些介面的具體 MRTK 實作,除非絕對必要。 在所有情況下,最好參考介面。 明確參考具體型別將會限制您的互動物件只使用目前現有的類型。 藉由只參考介面,您可確保與未來可能不會子類別現有實作的實作相容。

IVariableSelectInteractor

實作此介面的互動程式可能會發出變數 (,也就是可互動的類比) 選取性。 您可以使用 屬性查詢 SelectProgress 變數選取量。 實作此介面的 MRTK 互動專案包括 MRTKRayInteractorGazePinchInteractor 。 基底互動 (預設的 XRI 可互動專案,而 MRTKBaseInteractable) 不會受到變數選取量的影響; StatefulInteractable 不過,會接聽此值,並根據所有參與變數和非變數互動專案的 計算其 Selectednessmax()

IGazeInteractor

實作此介面的互動專案代表使用者的被動注視,與任何操作或意圖分開。 MRTK 實作是 FuzzyGazeInteractor ,繼承自 XRI XRRayInteractor ,並新增模糊圓錐轉換邏輯。 XRBaseInteractable會在 暫留時 IGazeInteractor 加上旗標 IsGazeHovered

IGrabInteractor

實作此介面的互動專案代表實體近欄位抓取互動。 attachTransform定義為抓取點。 MRTK 實作是 GrabInteractor ,其子類別為 XRI 的 XRDirectInteractor

IPokeInteractor

實作此介面的互動專案代表擷取互動。 請注意,這不一定代表手指! 任意互動者可以實作此介面,並提供來自非手指來源的擷取互動。 在幾個檢查互動器介面的其中一個實例中是個不錯的主意,例如 PressableButton 接聽 IPokeInteractor s 等可互動性,特別是磁片區按下。 任何實作 IPokeInteractor 的互動者都會引發按鈕上的 3D 按下。

IPokeInteractorPokeRadius會公開 屬性,這個屬性會定義擷取物件的特性。 將擷取視為置中 attachTransform ,並從 向外 attachTransformPokeRadius 延伸。 可互動專案,例如 PressableButton 依這個半徑來位移其 3D 推播距離,這可由使用者的實體手指粗細在手指型按下時驅動。

這個介面的 MRTK 實作為 PokeInteractor 。 在我們的範本專案中,我們也提供另一個不是手指導向的 IPokeInteractor 範例; PenInteractor 提供以虛擬 3D 手寫筆提示為根的 Poke 互動。

IRayInteractor

實作此介面的互動專案代表以光線為基礎的點對互動。 attachTransform代表選取範圍期間,目標物件介面上光線的點擊位置。

這個介面的 MRTK 實作是 MRTKRayInteractor ,直接繼承自 XRI XRRayInteractor

注意

XRI XRRayInteractor 不會實作此 MRTK 介面。

ISpeechInteractor

實作此介面的互動專案代表語音驅動互動。 MRTK 實作為 SpeechInteractor

MRTK SpeechInteractor 會在內部使用 PhraseRecognitionSubsystem 並訂閱 XRI XRInteractionManager 的可互動註冊事件。 不過,互動性不需要擔心哪些子系統正在執行語音處理; ISpeechInteractor會 (選取產生相同的 XRI 事件,以此類推) 任何其他互動者。

IGazePinchInteractor

這個介面只是介面的 IVariableSelectInteractor 特製化。 實作此介面的互動專案是隱含的變數選取互動專案。 IGazePinchInteractor表示間接以遠端操作為目標的 。 以注視為基礎的互動器會驅動互動的目標,而操作是由手部或控制器所驅動。 attachTransform的行為與 的 attachTransform 相同方式 IRayInteractor ;它會在起始選取專案時貼齊目標上的點擊點。

當多個 IGazePinchInteractor 參與單一互動時,其 attachTransform 會從所有參與的捏合點之間的中位數點位移來位移。 因此,可互動的解譯 attachTransform 方式與任何其他多手互動的方式相同,例如 attachTransforms 擷取互動或光線互動。

MRTK 實作是 GazePinchInteractor

IHandedInteractor

某些互動者可以選擇實 IHandedInteractor 作介面,以明確指定它們與使用者上的特定手部相關聯。 某些互動專案不會與手部關聯,因此不會實作此動作。 最明顯的範例是 或 FuzzyGazeInteractorSpeechInteractor

實作此介面的 MRTK 互動專案是 HandJointInteractor ,這是由任意手部聯合、 GazePinchInteractor 、 和 MRTKRayInteractor 所驅動之泛型抽象 XRDirectInteractor

互動專案目前會使用此介面在選取時引發特定效果,該效果必須在左手或右手之間厘清。 最值得注意的範例是 UX 元件庫中的脈衝效果。