互動器架構 - 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 在 「移動邏輯」ObjectManipulator
Slider
中所做的大部分工作,都是互動者本身的責任。 互動者現在會控制其 attachTransform,以定義特定類型的操作行為。 人們不再需要在輸入形式之間差異的可互動性上撰寫複雜的互動邏輯;相反地,您的統一操作邏輯可以接聽 attachTransform
的姿勢,而不論輸入形式或驅動它的裝置為何。
例如, GrabInteractor
的 attachTransform
位於手/控制器上的抓取點。 XRRayInteractor
的 attachTransform
位於光線結尾的命中點。 CanvasProxyInteractor
的 attachTransform
位於滑鼠已按下的位置。 對於所有這些不同的互動專案,可 互動者不需要關心互動者的類型,才能適當地回應操作。
可互動的查詢 , attachTransform
不論互動器類型為何,都可以處理每個 attachTransform
相同的查詢。
這種方法對於與現有 XRI 互動專案相容非常重要,以及針對尚未開發之輸入形式的未來證明您的互動。 如果引進新的輸入法,如果新的互動器產生有效且運作 attachTransform
良好的 ,則不需要改變現有的可互動性。
因此,在哲學上,attachTransform
是互動邏輯。 對於任何自定義互動,請一律偏好使用新的邏輯撰寫新的 attachTransform
互動器,而不是重寫或擴充可互動專案,以針對新的互動進行自定義。 如此一來,所有現有的互動者都可以享受新互動的好處,而不只是您重寫或擴充過的互動專案。
XRControllers 和輸入系結
大部分互動專案不會直接系結至輸入動作。 大部分衍生自 XRBaseControllerInteractor
,這需要 XRController
階層中互動器上方的 。 系 XRController
結至輸入動作,然後將相關的動作(選取等等)傳播到所有附加的 Interactors。
不過,某些互動專案可能需要特殊的輸入系結或未提供的其他輸入 XRController
。 在這些情況下,Interactors 可以選擇直接系結至自己的唯一輸入動作,或甚至使用其他非輸入系統來源來進行互動邏輯。 XRI 基類偏好接 XRController
聽 的系結,但這些行為可以覆寫為使用外部或替代輸入來源。
介面
XRI 定義基本 IXRInteractor
、 IXRHoverInteractor
、 IXRSelectInteractor
和 IXRActivateInteractor
。 MRTK 會定義動作專案的其他介面。 有些公開 MRTK 特定互動的其他資訊,有些則只是為了分類和識別。 這些介面全都位於 Core 套件內,而實作則位於其他套件中,包括 Input。
重要
如果您需要篩選特定類型的互動,雖然這些介面很有用,但建議您不要硬式編碼您的互動來特別接聽這些介面。 在每個情況下,一律會優先使用一般 XRI isSelected 和 isHovered,而不是任何互動特定的介面。
除非必要,否則您不應該在互動中參考這些介面的具體 MRTK 實作,除非絕對必要。 在所有情況下,最好參考介面。 明確參考具體類型會限制您的互動物件只能與目前現有的類型搭配使用。 藉由只參考介面,您可確保與未來可能不是現有實作子類別的實作相容。
IVariableSelectInteractor
實作此介面的 Interactors 可以發出變數(也就是類比)可互動的選取性。 您可以使用 屬性來查詢 SelectProgress
變數選取數量。 實作此介面的 MRTK 互動專案包括 MRTKRayInteractor
和 GazePinchInteractor
。 基底可互動專案 (預設的 XRI 可互動和 MRTKBaseInteractable
) 不會受到變數選取量的影響;StatefulInteractable
不過,會接聽此值,並根據所有參與變數和非變數互動項目來max()
計算它Selectedness
。
IGazeInteractor
實作此介面的 Interactors 代表使用者的被動注視,與任何操作或意圖不同。 MRTK 實作是 FuzzyGazeInteractor
,繼承自 XRI XRRayInteractor
,並新增模糊圓錐轉型邏輯。 XRBaseInteractable
會在暫留時IGazeInteractor
加上旗IsGazeHovered
標。
IGrabInteractor
實作此介面的互動專案代表實體近距離抓取互動。 attachTransform
定義為抓取點。 MRTK 實作是 GrabInteractor
,它會子類別 XRI 的 XRDirectInteractor
。
IPokeInteractor
實作此介面的互動專案代表叫用互動。 請注意,這不一定意味著手指! 任意動作專案可以實作這個介面,並提供來自非手指來源的擷取互動。 在少數情況下,檢查互動器介面是個好主意, PressableButton
例如接聽 IPokeInteractor
s,特別是磁碟區按下。 實作 IPokeInteractor
的任何互動程式都會引發按鈕上的 3D 按下。
IPokeInteractor
PokeRadius
會公開 屬性,這個屬性會定義叫用物件的特性。 將神奇點視為置中, 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
的可互動註冊事件。 不過,互動物件不需要擔心哪個子系統正在執行語音處理; ISpeechInteractor
s 會產生任何其他互動者所執行的相同 XRI 事件(選取等等)。
IGazePinchInteractor
這個介面只是介面的 IVariableSelectInteractor
特製化。 實作此介面的 Interactors 是隱含的變數選取互動專案。 IGazePinchInteractor
表示間接目標遠端操作。 個別的注視型互動器會驅動互動的目標,而操作是由手部或控制器。 attachTransform
行為的方式IRayInteractor
attachTransform
相同;當起始選取時,它會貼齊目標上的命中點。
當多個 IGazePinchInteractor
參與單一互動時,它們的 attachTransform
位移會從所有參與點之間的中間點位移來位移。 因此,可互動者可以透過與任何其他多手互動相同的方式解譯這些 attachTransform
,例如 attachTransforms
從抓取互動或光線互動。
MRTK 實作是 GazePinchInteractor
。
IHandedInteractor
某些互動專案可以選擇實 IHandedInteractor
作介面,以明確指定它們與使用者上的特定手部相關聯。 某些互動專案與手部無關,因此不會實作此動作。 最明顯的範例是 或 FuzzyGazeInteractor
之類的SpeechInteractor
範例。
實作此介面的 MRTK Interactors 是 HandJointInteractor
、由任意手關節、GazePinchInteractor
和 MRTKRayInteractor
所驅動之泛型XRDirectInteractor
抽象。
互動物件目前會使用此介面在選取時引發某些效果,該效果必須在左手或右手之間釐清。 其中最值得注意的範例是UX元件庫中的脈衝效果。