控制器藍圖
不同控制器的實現通過組件完成,便于在演員中(zhōng)進行擴展或替換。
父組件類 BP_ControllerComponent(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)負責訪問注視控制器和指針控制器。該藍圖為(wèi)管理(lǐ)交互提供了基礎,并包含一些可(kě)以在所有(yǒu)派生控制器中(zhōng)由開發者自定義的選項。
● 自動激活(Auto Activate):指示控制器是否默認啓用(yòng)。
● 延遲啓動(Delay Start):應用(yòng)程序啓動或加載新(xīn)地圖時,交互啓用(yòng)前的等待時間。
● 标簽組件(Tag Component):父組件(來自 pawn 角色)上的标簽名(míng)稱,以便後續在控制器組件實現中(zhōng)進行引用(yòng)。
以下是與控制器組件交互或創建自定義子控制器組件時需要注意的一些函數:
● Start:此事件應僅在首次初始化控制器時調用(yòng),不支持重寫。最好從 Begin Play 節點調用(yòng)。
● Start_Implementation:此函數負責每個子組件的具(jù)體(tǐ)初始化。
● Set Default Controller:配置組件在初始化後是否應被激活。因此,這個函數僅在 Start 函數之前調用(yòng)時才有(yǒu)意義。
● Enable:啓用(yòng)組件。
● Disable:禁用(yòng)組件。
● Is Enable:返回組件是否已啓用(yòng)。
● Press/Release Button:使用(yòng) Widget Interaction Component 管理(lǐ)按鈕交互。
● Is Over Interactable Widget:返回 Widget Interaction Component 是否指向一個可(kě)交互的 Widget。
提示! 在 XR 項目的控制器中(zhōng),關鍵組件是 Widget Interaction Component。所有(yǒu)組件或派生組件應該僅根據控制器的類型來建立交互規則。有(yǒu)關該組件的基本信息,請參考 Unreal 文(wén)檔。 |
注視控制器
注視控制器 BP_GazeControllerComponent(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)負責管理(lǐ)射線(xiàn)投射和與場景中(zhōng) Widget 的交互,以及延遲交互功能(néng)和指針的“點擊”功能(néng)。
注視指針限制 目前,注視指針隻能(néng)與場景中(zhōng)的 Widget 進行交互,無法與 3D 演員進行交互,這與 Pointer Controller 不同,後者可(kě)以與 Widget 和 3D 演員都進行交互。 |
開發者可(kě)以自定義的選項包括:
● Move Reticle to Hit:啓用(yòng)此選項後,當用(yòng)戶注視一個交互對象時,瞄準點會移動到該對象的交互位置。
● Timer Duration:用(yòng)戶需要注視某個對象多(duō)長(cháng)時間才能(néng)選擇它。
● Default Distance:當啓用(yòng) bMoveReticleToHit 時,設置注視控制器的距離。
● Vertical Bias:瞄準點的垂直位置,0 表示屏幕中(zhōng)心,1 表示屏幕頂部,-1 表示屏幕底部。
● Reticle Outer Ring:外環瞄準點的材質(zhì),如果設置為(wèi) NULL,則表示外環被禁用(yòng)。此功能(néng)在 SDK 版本 0.15.0 中(zhōng)已棄用(yòng)。
最後,樣本中(zhōng)用(yòng)于指向世界的瞄準點由一個隐藏的 Widget Component 和一個 Stereo Layer 組件組成。所有(yǒu)與注視相關的組件都會使用(yòng)組件标簽(gaze)進行區(qū)分(fēn),控制器組件假設注視的 Widget Interaction Component 始終是其他(tā)必要組件的父組件。
● Stereo Layer:為(wèi)了避免指針出現抖動,建議在立體(tǐ)層中(zhōng)渲染紋理(lǐ),要使其正常工(gōng)作(zuò),需要啓用(yòng) Live Texture,并将 Stereo Layer Shape 設置為(wèi) Quad Layer。請注意,與其他(tā)組件不同,Unreal會将此組件的變換值解釋為(wèi)相對于相機,而不是相對于父組件或附加的 Actor。函數 Update Reticle Position(在組件藍圖中(zhōng))将 Widget 移動到交互擊中(zhōng)位置,并計算相對于相機的位置以用(yòng)于立體(tǐ)層。然而,大小(xiǎo)必須使用(yòng) Quad Size 變量來定義,而不是使用(yòng)縮放。此外,由于控制器組件會将 Widget Component 的渲染複制到立體(tǐ)層中(zhōng),因此紋理(lǐ)不需要初始化。
● Widget Component:此組件被隐藏,因為(wèi)立體(tǐ)層負責渲染瞄準點。可(kě)以在 WBP_GazePointer 資産(chǎn)中(zhōng)修改原始紋理(lǐ)(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > UI)。它使用(yòng)靜态材質(zhì)(MI_Reticle_Inner)來渲染内環,而外環則使用(yòng)動态材質(zhì)(MI_Reticle_Outer),這個動态材質(zhì)定義了一個參數(Percentage),用(yòng)于實現瞄準點交互的視覺效果。
指針控制器
指針控制器的主要功能(néng)在 BP_PointerControllerComponent 中(zhōng)實現(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)。它的工(gōng)作(zuò)原理(lǐ)與其他(tā)控制器類似,但初始化過程會根據設備是否支持 3DoF 或 6DoF 進行調整。使用(yòng)微軟交互配置文(wén)件的控制器會自動作(zuò)為(wèi) 3DoF 控制器啓用(yòng),而使用(yòng) Oculus 交互配置文(wén)件的控制器會自動作(zuò)為(wèi) 6DoF 控制器啓用(yòng),這些設置都在 Motion Controller Component 中(zhōng)完成。
請注意,當使用(yòng) 3DoF 控制器時,必須選擇左手。對于 6DoF 控制器,選擇的手可(kě)以是左手或右手,這取決于控制器設計的手型。此外,開發者還可(kě)以選擇哪個控制器處理(lǐ)交互。
Spawn Controller 函數會生成一個 BP_PointerController 類的子 Actor,該子 Actor 是通過 Motion Controller Class 變量設置的。
BP_PointerController Actor(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Placeable)已準備好管理(lǐ)每個獨立的控制器。
Motion Controller Component 作(zuò)為(wèi)根組件的子組件添加,用(yòng)于管理(lǐ)每個控制器。該組件的 Visualization 部分(fēn)允許在虛拟世界中(zhōng)渲染一個 3D 模型,以跟随現實世界中(zhōng)控制器的移動,隻需啓用(yòng) Display Device Model 選項,如果開發者希望根據配置文(wén)件顯示每個設備的默認網格,可(kě)以在 Display Model Source 選項中(zhōng)選擇 OpenXR。否則,開發者可(kě)以選擇 Custom 來進行自定義,并在 Custom Display Mesh 中(zhōng)添加網格。最後,在 Motion Controller 部分(fēn),開發者應設置輸入類型。
隻有(yǒu)在啓用(yòng)交互的情況下,Motion Controller Component 必須附加以下組件:Widget Interaction Component,用(yòng)于準确跟蹤控制器在現實世界中(zhōng)的移動,以及一個 Static Mesh Component(在示例中(zhōng)稱為(wèi) Laser Pointer Mesh),用(yòng)于可(kě)視化指針。不論是否啓用(yòng)交互,如果使用(yòng)的是 6DoF 設備,則父組件需要附加一個 Child Actor Component,使用(yòng) BP_XRControllerRepresentation(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Placeable),以顯示控制器及其動畫。
手部追蹤控制器
手部追蹤控制器 BP_HandTrackingControllerComponent(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)負責生成和啓用(yòng)使用(yòng)手部追蹤進行遠(yuǎn)程交互所需的 Actor。這些 Actor 将自動處理(lǐ)交互。該控制器僅在項目設置中(zhōng)的手部追蹤功能(néng)(位于 Project Settings > Snapdragon Spaces plugin)被啓用(yòng)時才會激活。此控制器支持與場景中(zhōng)的 Widget Actor 以及可(kě)以通過手部追蹤進行交互的 Actor 進行交互。有(yǒu)關手部追蹤交互的詳細信息,請參考手部追蹤示例。
輸入快捷方式
用(yòng)于輸入操作(zuò)的按鈕:
主機控制器 | 右側 XR 控制器 | 左側 XR 控制器 | |
選擇 | 觸摸闆點擊 | 右側觸發按鈕 | 左側觸發按鈕 |
凝視/指針切換 | 菜單按鈕 | 無 | 左側菜單按鈕 |
觸摸闆 | 觸摸闆 | 無 | 左側搖杆 |
錨點位置确認 | 觸摸闆點擊 | 任何觸發按鈕 | 任何觸發按鈕 |
UI用(yòng)戶界面
世界中(zhōng)的 3D 小(xiǎo)部件必須使用(yòng)藍圖 BP_3DWidget 創建(位于 SnapdragonSpacesSamples Content > Snapdragon > Common > UI),并在 WidgetComponent 中(zhōng)定義 UI。為(wèi)了與凝視控制器或指針控制器配合使用(yòng),該藍圖必須是 BP_3DWidget 的子類。
觸覺反饋
要使用(yòng)觸覺反饋,Snapdragon Spaces 提供了 SetSpacesHapticsByValue 函數,可(kě)以在藍圖中(zhōng)調用(yòng)。此函數需要以下參數:玩家控制器、頻率(Hz)、幅度(Cm)、持續時間(秒(miǎo))以及控制器的手部。