此教程相關(guān)的詳細(xì)教案,文檔,思維導(dǎo)圖和工程文件會(huì)放入 Spatial XR 社區(qū)。這是一個(gè)高質(zhì)量知識(shí)星球 XR 社區(qū),博主目前在內(nèi)擔(dān)任 XR 開發(fā)的講師。此外,該社區(qū)提供教程答疑、及時(shí)交流、進(jìn)階教程、外包、行業(yè)動(dòng)態(tài)等服務(wù)。
社區(qū)鏈接:
Spatial XR 高級(jí)社區(qū)(知識(shí)星球)
Spatial XR 高級(jí)社區(qū)(愛發(fā)電)
往期回顧:
Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (一) 安裝和配置
Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (二) 手部動(dòng)畫
Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (三) 轉(zhuǎn)向和移動(dòng)
Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (四) 傳送
Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (五) UI
Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (六)手與物品交互(觸摸、抓?。?br>Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit(七)射線抓取
在 VR 交互中,手指觸控也是一種常見的交互方式,比如直接用手指去戳按鈕、用手指滑動(dòng) UI 等。這種交互方式用英文表示就是 Poke Interaction。XR Interaction Toolkit 從 2.3.0 版本開始增加了對 Poke 功能的支持。這篇教程,我將介紹一下如何實(shí)現(xiàn) Poke Interaction。
??教程說明
使用的 Unity 版本: 2021.3.5
使用的 VR 頭顯: Oculus Quest 2
教程使用的 XR Interaction Toolkit 版本:2.3.2(此教程盡量考慮了向上兼容,如果有過期的地方,歡迎大家指出)
項(xiàng)目源碼(持續(xù)更新):https://github.com/YY-nb/Unity_XRInteractionToolkit2.3.2_Demo
前期的配置:環(huán)境配置參考教程一,手部模型參考教程二,手部模型的動(dòng)畫使用這篇教程(Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit 番外(一)用 Grip 鍵, Trigger 鍵和搖桿控制手部動(dòng)畫)中的配置,也就是當(dāng)玩家按下手柄的 Trigger 鍵時(shí),手部會(huì)呈現(xiàn)出食指向前指的姿態(tài),以便對其他物體進(jìn)行觸控交互。本篇教程的場景基于上一篇教程搭建的場景進(jìn)行延伸,也就是沿用了之前教程里所配置的移動(dòng)、抓取、用射線與 UI 進(jìn)行交互等功能。
最終實(shí)現(xiàn)的效果:
??XR Poke Interactor
交互包含了發(fā)起交互的對象(Interactor)和可被交互的對象(Interactable)。XR Interaction Toolkit 為我們提供了一個(gè) XR Poke Interactor 腳本,用于實(shí)現(xiàn) Poke 功能。
首先,我們回顧一下 XR Origin 當(dāng)前的層級(jí)(沿用了上一篇教程):
類似的,我們分別在 LeftHand Controller 和 RightHand Controller 物體下創(chuàng)建一個(gè)空物體,名為 Poke Interactor:
然后在 Poke Interactor 物體上添加 XR Poke Interactor 腳本:
組件每個(gè)參數(shù)的詳細(xì)介紹可以參考官方文檔:https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@2.3/manual/xr-poke-interactor.html
接下來,我們設(shè)置 XR Poke Interactor 中的 Attach Transform,這個(gè)東西相當(dāng)于 Interactor 和 Interactable 發(fā)生交互的地方。對于手指觸控來說,交互點(diǎn)位于食指的指尖處比較合適,比如想要用手指去點(diǎn)擊按鈕進(jìn)行交互,當(dāng)指尖戳向按鈕的時(shí)候,就相當(dāng)于發(fā)生了 Poke 觸控交互。因此,我們在手部模型下創(chuàng)建一個(gè)子物體代表交互點(diǎn),然后設(shè)置它的位置,如下圖中的 Poke Point 所示:
然后將 Poke Point 物體拖至 XR Poke Interactor 腳本中的 Attach Transform 處:
現(xiàn)在,Poke Interactor 已經(jīng)配置成功了。不過如果手部擁有其他的 Interactor,如下圖所示,我們可以在 LeftHand Controller 和 RightHand Controller 上的 XR Interaction Group (前兩篇抓取教程中配置的)中添加 Poke Interactor,這樣當(dāng)其中一個(gè) Interactor 起作用的時(shí)候,其他的 Interactor 會(huì)暫時(shí)失效,保證只有一個(gè) Interactor 在發(fā)揮作用,比如我在點(diǎn)擊 UI 按鈕的時(shí)候不希望手部射線與 UI 也發(fā)生交互。
??與 UI 進(jìn)行觸控交互
?添加 Tracked Device Graphic Raycaster 和 XR UI Input Module 讓 UI 可被交互
為了讓 UI 能夠被交互,需要在場景中添加一些腳本,這部分的配置和這篇教程:Unity VR開發(fā)教程 OpenXR+XR Interaction Toolkit (五) UI 中的配置是一樣的。簡單來說,就是在 Canvas 上添加 Tracked Device Graphic Raycaster 腳本,在 EventSystem 上添加 添加 XR UI Input Module 腳本。
現(xiàn)在運(yùn)行程序,應(yīng)該可以看到效果了:
??與物體進(jìn)行交互
這里演示一個(gè)最簡單的功能:食指去戳物體的時(shí)候,讓物體變色,食指離開物體后,物體的顏色復(fù)原。
?XR Simple Interactable
我這里用一個(gè)紅色方塊來代表可交互的物體,在方塊上添加 XR Simple Interactable 腳本:
然后在 XR Simple Interactable 的 Interactable Events 中添加事件。我這邊在 Select Entered 的時(shí)候讓方塊材質(zhì)變成黃色,在 Hover Exited 的時(shí)候讓方塊的材質(zhì)變成原來的紅色,當(dāng)手指戳入方塊時(shí),觸發(fā) Select Entered 事件;當(dāng)手指取消懸停,也就是差不多離開方塊的時(shí)候觸發(fā) Hover Exited 事件。這里選擇 Hover Exited 事件而不是 Select Exited 的事件是因?yàn)榻?jīng)過測試, Hover Exited 的效果會(huì)更好,Select Exited 容易誤觸發(fā)。
現(xiàn)在,我們已經(jīng)配置好了 Poke 所需要的 Interactor 和 Interactable。但是因?yàn)?XR Simple Interactable 默認(rèn)也會(huì)被其他的 Interactor 觸發(fā),而我們的 LeftHand Controller 和 RightHand Controller 下有多個(gè) Interactor,這會(huì)造成手靠近方塊時(shí)按下手柄 Grip 鍵也會(huì)觸發(fā) Select Entered 事件,也就是 XR Direct Interactor 與 Interactable 發(fā)生了交互,因?yàn)?XR Direct Interactor 對應(yīng)的 Select Action 綁定了 “按下 Grip 鍵的操作”。
為了解決這個(gè)問題,其中一個(gè)思路是將 XR Poke Interactor 上的 Interaction Layer Mask 和方塊掛載的 XR Simple Interactable 上的 Interaction Layer Mask 設(shè)為同一個(gè)層級(jí),這樣其他不同層級(jí)的 Interactor 就不會(huì)與方塊的 Interactable 發(fā)生交互。
但是經(jīng)過測試,XRI 2.3.2 的版本下,Poke Interactor 的 Interaction Layer Mask 如果和 Interactable 設(shè)置成一樣的,則無法觸發(fā) Poke 交互。這個(gè)大家可以自己測試一下,也歡迎大家和我進(jìn)行反饋。但是,如果我為 XR Simple Interactable 的 Interaction Layer Mask 單獨(dú)設(shè)置一個(gè)層級(jí)(我這里設(shè)置成了 Poke),然后 XR Poke Interactor 的 Interaction Layer Mask 設(shè)置成了 Everything,則可以成功地讓 Poke Interactor 單獨(dú)和方塊進(jìn)行交互。
?XR Poke Filter
但是如果我們這時(shí)候運(yùn)行程序,會(huì)發(fā)現(xiàn)無法觸發(fā) Poke 。這是因?yàn)槲覀兊?XR Poke Interactor 默認(rèn)勾選了 Require Poke Filter:
這樣,能夠發(fā)生 Poke 交互的物體就必須擁有 XR Poke Filter 組件。所以,我們還需要在方塊上添加 XR Poke Filter 組件,它能對 Poke 的觸發(fā)條件做一些過濾(官方文檔:https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@2.3/manual/xr-poke-filter.html):
組件上有個(gè) Poke Configuration 可以調(diào)整一些參數(shù),我這邊把 Poke Direction 設(shè)為了 Negative Y,也就是手指從上往下觸碰方塊的時(shí)候可以觸發(fā) Poke。
現(xiàn)在運(yùn)行程序就可以看出效果了:文章來源:http://www.zghlxwxcb.cn/news/detail-525568.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-525568.html
到了這里,關(guān)于Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit(八)手指觸控 Poke Interaction的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!