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