共用方式為


互動器架構 - MRTK3

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

摘要和檢閱

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

XRI 的好公民

自定義 MRTK 互動項目在預設 XRI 互動器介面方面表現良好;從 XRI 系統的觀點來看,它們與「香草」互動者無法區分。 反轉也是真的;在 MRTK 中建置進階互動專案時,預設的 XRI 互動動作專案仍適用於基本暫留並選取。 這是 MRTK 努力與現有 XRI 專案完全相容的一部分。 如果您有 XRI 應用程式,MRTK 可互動和 UI 控制件將會與現有的「香草」XRI 設定搭配使用。

輸入模式的抽象概念

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

從 MRTK v2,有一個常見的本能來撰寫特定輸入類型或裝置專屬的程式代碼互動。 許多開發人員習慣於撰寫互動,這些互動會特別針對接近抓取、遠光或其他特定輸入類型做出反應。

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

AttachTransform 和 Control 的反轉

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

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

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

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

因此,在哲學上,attachTransform互動邏輯。 對於任何自定義互動,請一律偏好使用新的邏輯撰寫新的 attachTransform 互動器,而不是重寫或擴充可互動專案,以針對新的互動進行自定義。 如此一來,所有現有的互動者都可以享受新互動的好處,而不只是您重寫或擴充過的互動專案。

XRControllers 和輸入系結

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

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

介面

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

重要

如果您需要篩選特定類型的互動,雖然這些介面很有用,但建議您不要硬式編碼您的互動來特別接聽這些介面。 在每個情況下,一律會優先使用一般 XRI isSelectedisHovered,而不是任何互動特定的介面

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

IVariableSelectInteractor

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

IGazeInteractor

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

IGrabInteractor

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

IPokeInteractor

實作此介面的互動專案代表叫用互動。 請注意,這不一定意味著手指! 任意動作專案可以實作這個介面,並提供來自非手指來源的擷取互動。 在少數情況下,檢查互動器介面是個好主意, PressableButton 例如接聽 IPokeInteractors,特別是磁碟區按下。 實作 IPokeInteractor 的任何互動程式都會引發按鈕上的 3D 按下。

IPokeInteractorPokeRadius會公開 屬性,這個屬性會定義叫用物件的特性。 將神奇點視為置中, attachTransform 並且從 attachTransform PokeRadius向外延伸。 互動專案,例如 PressableButton 將此半徑位移其 3D 推入距離,這可由用戶實體手指粗細在手指型按下的情況下驅動。

這個介面的 MRTK 實作是 PokeInteractor。 在我們的範本專案中,我們也提供另一個不是手指驅動的範例 IPokeInteractor ; PenInteractor 提供根植於虛擬 3D 手寫筆尖上的戳點互動。

IRayInteractor

實作此介面的互動專案代表以光線為基礎的指向互動。 attachTransform表示選取範圍期間目標物件表面光線的命中位置。

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

注意

XRI XRRayInteractor 不會實作此 MRTK 介面。

ISpeechInteractor

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

MRTK SpeechInteractor會在內部使用 PhraseRecognitionSubsystem 並訂閱來自 XRI XRInteractionManager的可互動註冊事件。 不過,互動物件不需要擔心哪個子系統正在執行語音處理; ISpeechInteractors 會產生任何其他互動者所執行的相同 XRI 事件(選取等等)。

IGazePinchInteractor

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

當多個 IGazePinchInteractor參與單一互動時,它們的 attachTransform位移會從所有參與點之間的中間點位移來位移。 因此,可互動者可以透過與任何其他多手互動相同的方式解譯這些 attachTransform,例如 attachTransforms 從抓取互動或光線互動。

MRTK 實作是 GazePinchInteractor

IHandedInteractor

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

實作此介面的 MRTK Interactors 是 HandJointInteractor、由任意手關節、GazePinchInteractorMRTKRayInteractor所驅動之泛型XRDirectInteractor抽象。

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