文章目錄
- 1 環境準備
- 2 新手指引:Building Blocks
- 2.1 創建 OVR 相機
- 2.2 創建交互功能
- 2.3 創建交互物體
- 3 老手開發:Interaction SDK
- 3.1 創建交互功能
- 3.2 創建交互物體
- 4 UI 交互
- 4.1 3D 按鈕
- 4.2 Unity UI
? 新版 Meta SDK(v74)優化了 Quest 開發流程,使得原本復雜的開發設置變得簡單了許多,這在舊版(v63)是不可想象的!
? 特此記錄。
配置環境:
- Windows 11
- Unity 6000.0.42f1
- Meta SDK v74.0.2
- Quest3
舊版鏈接:
2024-04-03 NO.4 Quest3 手勢追蹤抓取物體(舊)_quest3 手勢識別-CSDN博客
2024-04-08 NO.5 Quest3 手勢追蹤進行 UI 交互(舊)_quest3手勢-CSDN博客
2024-04-08 NO.6 Quest3 自定義交互事件(舊)_unity quest3快速配置模型交互-CSDN博客
Quest3 環境配置教程:
- 2025-03-17 NO.1 Quest3 開發環境配置教程_quest3 unity 開發流程-CSDN博客
1 環境準備
? 創建新場景 InteractionDemo,刪除 Main Camera。

2 新手指引:Building Blocks
? Building Blocks 是 Meta 推出的 Unity 內置開發教程,通過拖拽的形式快速配置開發環境,并帶有錯誤檢查功能。下面我們來看看。
2.1 創建 OVR 相機
? 選擇菜單欄中的“Meta”,依次點擊“Tools”->“Building Blocks”。

? 將 Camera Rig 塊拖拽到 Hierarchy 窗口中。

? 即可創建出 OVR Camera Rig。其名稱由 “[BuildingBlock]” 開頭,表示由 Building Blocks 創建。
? 點擊該物體,在 Inspector 面板中可看到 BuildingBlock 的介紹,包括:
- Version:版本
- Dependencies:該塊的依賴。
- Used by:被 xxx 引用。
? 此時佩戴 Quest3 運行 Unity,即可看到場景。

2.2 創建交互功能
? 打開 Building Blocks,選擇 “Interaction” 分類,將 “Controller Interactions” 拖拽到 Hierarchy 窗口中。Building Blocks 會自動為我們創建 Interaction 模塊,包括 OVRHmd 和 Controller Interactions。同時在 TrackingSpace 下創建對應的 Anchor。

? 此時運行 Unity,可以識別到手柄,但無法交互。接下來配置可交互物體。
2.3 創建交互物體
? 將 “Grab Interaction” 拖拽到 Hierarchy 窗口中。可看到創建了一個 Cube,并自動為其創建了 HandGrab 子物體,該物體上掛載了 Grabbable、Hand Grab Interactable 和 Grab Interactable 腳本。在以往版本(v63)中,這些都需要一個個手動創建,而且還需要記住腳本間的相互引用,天吶!😢
? 可以看到,已添加的塊右下角圖標和未添加的塊有所區別(下圖綠色標識)。

? 此時運行 Unity,即可直接用手抓 Cube 了!
? 但建議將 Cube 先放在一個合適的位置,并且將 OVRCameraRig 下 CenterEyeAnchor 的相機背景改為 Skybox,否則容易看不到物塊。

? 其他 Block 大家自行探索。
3 老手開發:Interaction SDK
? 盡管 Building Blocks 很令人經驗,但是其功能塊有限,無法滿足定制化的需求(例如 UI 交互)。
? 但是,Meta 還是貼心地給出了方便的解決方案:右鍵 -> Interaction SDK。
? 而在老版本(v63)中,右鍵出不來 Interaction SDK:😿

?
? 現在,我們將場景中所有物體刪除,只保留 Directional Light,重新從零開始。
3.1 創建交互功能
? 在 Hierarchy 窗口中右鍵,依次選擇 Interaction SDK -> Add OVR Interaction Rig。

? 彈出提示面板,提示我們需添加 OVR Camera Rig。點擊 Fix All,再點擊 Create 創建 OVR Interaction Rig。

? 可以看到創建了 OVRCameraRig,其子物體包括:

- TrackingSpace:用于跟蹤與獲取設備數據。
- OVRInteractionComprehensive:字面意思是全面的 Interaction,確實可以看到,什么交互功能都有(懶人必備)。

? 展開 OVRCameraRig,找到其子物體 PlayerController,將 “First Person Locomotor.cs” 腳本上 Gravity Factor 改為 0,避免進入場景玩家立即下墜。

3.2 創建交互物體
? 在 Hierarchy 窗口中右鍵,依次選擇 3D Object -> Cube。創建一個 Cube,用于抓取(可以順便改一下位置和縮放,方便后續好抓)。

? 選中 Cube,右鍵,還是選擇 Interaction SDK。此時由于選中了物體,比上次多了 6 個選項,其中第 3-6 個是用于 3D 物體交互的,分別為:
- Add Grab Interaction:添加抓取交互(手柄 + 手勢均支持)。
- Add Ray Interaction:添加射線交互(手柄 + 手勢均支持)。
- Add Distance Grab Interaction:添加遠距離抓取交互(手柄 + 手勢均支持)。
- Add Teleport Interaction:添加傳送交互(手柄支持)。
? 這里以第一個為例,選擇 Add Grab Interaction。

? 彈出了提示窗口,提醒說必須為 Cube 添加 Rigidbody 組件才能 Grab。點擊 Fix,然后 Create。

? 可以看到為 Cube 創建了 ISDK_HandGrabInteraction 子物體,該物體上掛載了 Grabbable、Hand Grab Interactable 和 Grab Interactable 腳本。
- Grabbable:該物體允許被抓取(必需)。
- Hand Grab Interactable:支持手勢抓取(可選)。
- Grab Interactable:支持手柄抓取(可選)。

? 此時運行 Unity,即可使用手柄或手勢抓取 Cube!
4 UI 交互
? 新版 SDK 中,配置 UI 交互也變得非常簡單。這里我將其分為以下 2 類。
4.1 3D 按鈕
? 叫 3D 按鈕,是因為這是 3D 交互,且僅支持按鈕交互hh。在 Building Blocks 里面找到 Poke Interaction,拖進來。

? 將額外添加的 [BuildingBlock] Hand Interactions 刪去,咱有 OVRInteractionComprehensive 了。

? Poke Interaction 的層級結構如下:
- Poke Interaction(Poke Interactable 腳本使得其能夠被點擊)
- Model(Surface 的父物體,無特殊功能)
- Surface(定義按到底的平面)
- Visuals(ButtonVisual 的父物體,會比 Surface 突出一些,營造 3D 立體感)
- ButtonVisual(渲染按鈕部分)
- Model(Surface 的父物體,無特殊功能)
? 該 3D 交互的原理是,手將 Visuals 向前推,推到與 Surface 重合時便停止不動,給人一種真實按下的感覺。
? 此時運行 Unity,可以按下該 Button,但什么都不會發生。要使得按下能夠出發相應事件,需要在 Poke Interaction 物體上掛載 Interactable Unity Event Wrapper 腳本。并執行以下操作:
- 關聯哪個 Interactable 被監聽。這里將 Poke Interactable 拖拽到 Interactable View 中進行關聯(下圖紅色標注)。
- 腳本中依據事件名稱關聯相應的方法。例如,這里我在 Select 中關聯了 Cube 的 SetActive 方法,并傳入 false(未勾選下方按鈕)。

? 此時,運行 Unity,按下 Button 后,Cube 將消失。
4.2 Unity UI
? 如果想和 Unity 中的 2D UI 交互,只需要一步操作即可。
? 這種方法支持 Unity 中的大部分 UI,例如 Button、Toggle、Slider 等。交互功能沒有問題,但給人感覺體驗不如 3D Button。
? 首先右鍵選擇 UI -> Button - TextMeshPro,創建 Unity Button。

? 將 Canvas 的 Render Mode 設置為 World Space,并更改其位置和長寬(之前的太大了)。Button 也更改小一點。

? 選中 Canvas,右鍵依次選擇 Interaction SDK -> Add Poke Interaction Canvas。

? 彈出提示界面,需要在 EventSystem 中添加 Pointable Canvas Module 腳本以支持 UI 的 Point 交互。點擊 Fix,再點擊 Create。

? 可以看見為 Canvas 創建了 ISDK_PokeInteraction 子物體,其掛載了:
- Poke Interactable:可被點擊。
- Pointable Canvas:使 Canvas 下的所有 UI 支持點擊操作。

? 之后,就可以像往常 Unity 開發一樣,在 UI 中添加對應的事件了。

? 此時運行 Unity,點擊按鈕,即可將 Cube 隱藏。