国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入

這篇具有很好參考價值的文章主要介紹了Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

輸入系統(tǒng)是 VR 應用中非常重要的一部分。我們通常需要獲取 VR 手柄上某個按鍵的輸入,然后將其作用到應用中,比如按下手柄的 Grip 鍵進行抓取。在我的其他 Unity XR Interaction Toolkit 的開發(fā)教程里,已經(jīng)有介紹如何去獲取手柄的輸入。那么這篇教程我將做一個總結(jié),將相關(guān)的重點集中在一個教程里。


??教程說明

使用的 Unity 版本: 2021.3.5

使用的 VR 頭顯: Oculus Quest 2

教程使用的 XR Interaction Toolkit 版本:2.3.2(此教程盡量考慮了向上兼容,如果有過期的地方,歡迎大家指出)

OpenXR+XR Interaction Toolkit 的環(huán)境配置可以參考這篇教程:Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (一) 安裝和配置


??Input System 和 XR Input Subsystem(推薦 Input System)

在 XR Interaction Toolkit 中,有兩種接收輸入的方式。一種是 Action-based,另一種是 Device-based,它們分別對應兩種不同的輸入系統(tǒng),Action-based 使用的是 Unity 中的 InputSystem,Device-based 使用的是 Unity 中的 XR Input Subsystem,區(qū)別可以參考我的這篇文章:Unity XR Interaction Toolkit 組件解析(一)Action-based 和 Device-based 的區(qū)別
現(xiàn)在,XR Interaction Toolkit 官方推薦使用的是基于 Action-based 的 Input System。因此,我的系列教程中使用的也都是 Input System。

Input System 是 Unity 提供的一套更方便,拓展性更高的用于檢測鍵盤,手柄,鼠標,搖桿等設備輸入的系統(tǒng)。它將輸入設備和動作邏輯互相分離,通過配置映射來處理輸入信息。也就是說,我們可以在 Input System 中定義一個動作,這個動作可以是一至多個輸入操作的映射,也可以說這個動作能夠綁定一至多個設備輸入的操作。在 Unity 中,我們只需要提前配置好動作和輸入的映射關(guān)系,無需寫代碼來判斷設備輸入,只需把重心放在邏輯處理上,也就是檢測到輸入后要做的事情。舉個例子,我要在按下手柄 Grip 鍵的時候觸發(fā)抓取,那么我可以在 Input System 的配置文件中定義“抓取”這個動作,將“按下手柄 Grip 鍵”這個輸入操作與“抓取”動作進行綁定,此時動作和輸入就成了映射關(guān)系。然后在代碼中我們不需要監(jiān)聽“按下手柄 Grip 鍵”什么時候觸發(fā),只需要編寫按下手柄 Grip 鍵后觸發(fā)的抓取邏輯,將其與我們定義的動作關(guān)聯(lián)。這樣,Input System 會自動幫我們監(jiān)聽“按下手柄 Grip 鍵”的輸入操作,如果觸發(fā)了,則說明與輸入操作綁定的動作觸發(fā)了,這時候程序就會執(zhí)行我們編寫的抓取邏輯。

使用這種方式的好處是:

  1. 我們在代碼中關(guān)心的是定義的動作觸發(fā)后需要執(zhí)行什么樣的方法,而不用關(guān)心設備的輸入是否觸發(fā),設備的輸入由 Input System 自動監(jiān)聽。
  2. 以后我如果想把需求改為“按下手柄 Trigger 鍵進行抓取”,那么我只需要在配置文件里將“按下手柄 Trigger 鍵”的輸入操作與“抓取”動作綁定,形成映射關(guān)系,刪除原來“按下手柄 Grip 鍵”的綁定,而代碼不需要做任何改變。因為在代碼中我們是將與輸入綁定的動作與觸發(fā)的邏輯方法進行了關(guān)聯(lián),此時抓取需要做的事情關(guān)聯(lián)的仍然是“抓取”這個動作,只不過我們在配置文件中將與“抓取”動作綁定的輸入操作改為了“按下手柄 Trigger 鍵”。因此,我們在代碼中關(guān)心的是動作的觸發(fā),在配置文件中關(guān)心的是動作與什么樣的輸入綁定,而監(jiān)聽輸入完全交給了 Input System 本身,不用我們自己編寫監(jiān)聽輸入相關(guān)的代碼,這大大提高了可拓展性。
    Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

以上便是 Input System 輸入系統(tǒng)的使用思路。如果看到這里還有點懵,不用擔心,接下來我會演示具體的操作。


??Input Action Asset

Input Action Asset 是 Input System 中的配置文件。當我們導入了 XR Interaction Toolkit 的 Starter Assets 后,可以在下圖中的這個路徑(我的 XRI 版本是 2.3.2)看到這個資源文件:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

名字叫做 XRI Default Input Actions,它是 XR Interaction Toolkit 官方為我們準備的一個 Input Action Asset 配置文件,里面已經(jīng)配置了常用的動作與輸入的映射關(guān)系。我們可以雙擊這個文件,看看它長什么樣:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

跳出的頁面從左往右可以分為三個區(qū)域:Action Maps,Actions 和 Action Properties。

?Actions Maps

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

里面的每一行相當于一個動作輸入映射集,稱為 Input Action Map。

?Actions

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

里面的每一行相當于當前輸入映射集里定義的動作輸入映射。最左邊為綠色的代表動作(Action),每個動作可以添加下一個層級,也就是最左邊是藍色的這些東西,它們代表該動作綁定的輸入操作。如上圖所示,比如 Select 是一個動作,這個動作綁定了 gripPressed [LeftHand XR Controller] 和 indexPressed [LeftHand MetaAimHand] 兩個輸入操作。

?Action Properties

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

這個相當于某一個動作的屬性面板,選中 Actions 下的某一個動作就能看到最右邊的這個 Action Properties 面板。用的比較多的是 Action Type,可以看到它有三種類型:Value,Button,Pass through

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

??Action Type (Value, Button, Pass through)

Value 是一個值,可以代表連續(xù)的狀態(tài)變化。比如說手柄 Grip 鍵按下的程度,沒按的時候值為 0;逐漸按下最終按到底,值會逐漸增大到 1。再比如手柄搖桿推動的程度,也是需要用 Value 作為 Action Type。

Button 就是表示按鈕或者按鍵觸發(fā)的一次性動作。只有“按下”和“沒按下”兩種狀態(tài)。

Pass through 和 Value 類似。它們的區(qū)別按官方的說法是如果動作綁定了多個輸入,Value 會切換到最主要的那一個輸入,也就是當某一個輸入的值大于當前正在驅(qū)動動作的那一個輸入,值更大的那個輸入會接管驅(qū)動動作的權(quán)利。而 Passthrough 面對多個輸入時,只會讓最近發(fā)生的那個輸入驅(qū)動動作。這種一個動作綁定多個輸入,由輸入驅(qū)動動作的情況可能會在一個 PC 游戲連接了多個游戲手柄的時候發(fā)生,因為需要確保哪一個游戲手柄擁有主要控制權(quán)。而在 VR 開發(fā)中也許不是很常見,在日常開發(fā)中,Value 和 Button 用的比較多。

?Binding Properties

官方文檔:https://docs.unity3d.com/Packages/com.unity.inputsystem@1.4/manual/ActionBindings.htmll

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

我們回到 Actions 這一列,每個動作下綁定的東西(最左邊為藍色圖標)叫做 Binding,也就是與動作形成映射關(guān)系的輸入操作。以 XRI LeftHand Interaction 下的 Select 動作為例(上圖所示),先看一下 Select 動作的 Action Properties 面板:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

可以看出這是一個 Button 類型,表示某個按鈕是否被按下。然后點擊 Select 動作下的 gripPressed [LeftHand XR Controller],可以看到最右邊的面板變成了下圖所示的樣子:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

從上到下分為 Path,Use in control scheme,Interactions 和 Processors

??Path

Path 用一個路徑代表具體的輸入操作,上圖中表示的是“按下左手柄的 Grip 鍵”這一個輸入操作,也就是說 Select 動作與 “按下左手柄的 Grip 鍵”這一輸入進行了綁定。點開這個按鈕可以看到系統(tǒng)內(nèi)置了一些常用的輸入設備,這一塊會在后面的實戰(zhàn)過程中再次講解。

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

??Control Scheme

Path 參數(shù)的下方有一個 Use in control scheme,然后有一些選項可以勾選:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

Control Scheme 只是為了給輸入的 Binding 進行分組分類,圖中的三個選項是 XRI 為我們預置的分類。我們可以看到整個 Input Action Asset 面板左上角的 All Control Schemes,然后點開它:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
它相當于一個過濾器。當選中了 All Control Schemes(所有類別)時,XRI LeftHand Locomotion 下的 Actions 這一列如下圖所示:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
但是如果我將 Control Schemes 改成 Continous Move,Actions 這一列就會發(fā)生變化:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

可以看到此時就只有 Move 動作下顯示了 Binding(Primary2DAxis [LeftHand XR Controller]),而其他的 Binding 被過濾掉了。我們可以看一下 Primary2DAxis [LeftHand XR Controller] 的 Binding Properties 面板:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
因為 Use in control scheme 下的 Continuous Move 被勾選了,所以這個 Binding 屬于 Continuous Move 這個類別。而 XRI LeftHand Locomotion 下其他動作的 Binding 勾選了其他的 Control Scheme 類別,所以當我們的 Input Action Asset 面板的 Control Scheme 過濾器選擇了 Continous Move,當前 Input Action Map 下屬于 Continous Move 類別的 Binding 會顯示在 Actions 面板中,而其他類別的 Binding 會被過濾掉。

當然,我們也可以自定義 Control Scheme 類別:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

??Interactions

Interactions 對輸入的方式進行了更詳細的規(guī)范。

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

點擊 Interactions 右側(cè)的“+”號,可以看到系統(tǒng)為我們提供了幾個輸入方式。如果你想要詳細了解它們的區(qū)別,可以參考官方文檔:https://docs.unity3d.com/Packages/com.unity.inputsystem@1.4/manual/Interactions.html
Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

這里需要注意的是,如果動作的 Action Type 選擇了 Value,然后 Control Type 選擇了 Delta/Dpad/Stick/Vector2 中的其中一個,Binding Properties 下的 Interactions 會多出一個 Sector 選項。舉個例子,我們找到 XRI LeftHand Locomotion 下的 Teleport Select Activate 動作和與其綁定的 Primary2DAxis [LeftHand XR Controller],如下圖所示:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

先看一下 Teleport Select Activate 動作的 Action Properties 面板:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

與之前舉例的 Select 動作不同的是,Select 動作的 Action Type 是 Button,而 Teleport Select Activate動作的 Action Type 是 Value,并且 Control Type 是 Vector2,也就是說接收的輸入是一個二維向量。

然后查看 Primary2DAxis [LeftHand XR Controller] 的 Binding Properties 面板:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

可以看到這個輸入 Binding 已經(jīng)添加了一個名叫 Sector 的 Interaction,而這個 Sector 選項也是新增的。Sector 是扇區(qū)的意思,手柄搖桿的相關(guān)功能經(jīng)常要用到 Sector 這個 Interaction。因為搖桿是在一個圓形范圍內(nèi)運動,我們可以將其想象為 x-y 坐標系下的一個圓心在原點,半徑為 1 的圓:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
在 Primary2DAxis [LeftHand XR Controller] 中, Sector 的 Direction 為 North,那么對應的就是搖桿向前推動的輸入。我們可以想象成搖桿向下圖紅色區(qū)域推動時會觸發(fā)這個輸入操作:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
在 VR 中向前推動手柄搖桿觸發(fā)傳送的操作比較常見,因此 Teleport Select Activate 這個動作經(jīng)常用于激活傳送。因為 Teleport Select Activate 動作本身的 Action Type 是 Value,Control Type 是 Vector2,它的類型是一個二維向量,該動作綁定的輸入操作 Primary2DAxis [LeftHand XR Controller] 接收的是手柄搖桿的輸入,用一個二維向量表示,但是接收的是搖桿各個方向的輸入,所以要對輸入的方向做個限制,只有搖桿向前方的一小段扇區(qū)推動才能生效。于是需要在 Binding Properties 中的 Interactions 添加 Sector 類型,將 Direction 改為 North。

??Processors

Processors 處理器可以對接收的輸入數(shù)據(jù)進行處理,返回一個新的數(shù)據(jù)。
舉個例子,我們找到 XRI LeftHand Locomotion 下的 Move 動作,查看它綁定的輸入的 Binding Properties 面板:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

可以看到它的 Processors 添加了一個 Stick DeadZone,它有一個最小值和最大值,因為這個 Binding 接收的是一個來自搖桿的 Vector2 類型的二維向量數(shù)據(jù),當向量的大?。╩agnitude)小于 Min 值時,會將結(jié)果視為(0,0),當向量的大小大于 Max 值時,會將向量的大小歸一化為 1【比如(1,1)(1,-1)等】。

除此之外,還有其他類型的 Processor 可以選擇,當動作 Action 的 Action Type 不同時,供選擇的 Processor 也有所不同:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

每個 Processor 的作用可以參考官方文檔:https://docs.unity3d.com/Packages/com.unity.inputsystem@1.4/manual/Processors.html

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

?總結(jié)

總結(jié)一下 Input System 的結(jié)構(gòu)。首先需要一個 Input Action Asset 配置文件,里面包含了 Action Maps 動作輸入映射集,每一個映射集包含了 Actions 動作,每個動作綁定一至多個 Binding 輸入。根據(jù)我們前面介紹的,我們只會在配置文件中配置動作和輸入的映射關(guān)系,而在代碼中,我們需要引用 Action 動作。因此,我們需要記住 Input Action Asset => Action Map => Action 的結(jié)構(gòu),這對我們后續(xù)的代碼實戰(zhàn)有幫助。


??如何使用 Input System

當我們在 Input Action Asset 配置文件中配置了動作與輸入的映射關(guān)系后,我們可以在腳本中訪問 Input Action Asset 中配置的動作。一種使用場景是在代碼中編寫接收到輸入后執(zhí)行的方法,然后將其與 Input System 中相應的動作關(guān)聯(lián),這樣才能訪問我們的配置文件,當系統(tǒng)監(jiān)聽到輸入時,視為與其綁定的動作觸發(fā),從而觸發(fā)我們編寫的方法。另一種使用場景是獲取輸入的值,比如按下手柄 Grip 鍵來驅(qū)動手部動畫,需要根據(jù) Grip 鍵按下的程度來驅(qū)動動畫的切換。

?XR Interaction Toolkit 現(xiàn)有腳本調(diào)用 Input System 的原理

??Input Action Manager 腳本

當我們在場景中添加 XR Origin(VR) 這個物體的時候,XR Origin 物體上會自動添加一個 Input Action Manager 腳本,相當于輸入動作的管理者:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

可以看到 XRI 提供的 Input Action Asset(名字叫做 XRI Default Input Actions)被自動添加到了腳本的 Action Assets 中。

因為 Input System 中的 Actions 動作默認是關(guān)閉的,也就是系統(tǒng)默認不會監(jiān)聽我們配置的輸入,需要手動 Enable 這些 Action 才會開始監(jiān)聽。而 Input Action Manager 腳本可以幫我們激活添加到 Action Assets 中的動作,所以 XRI Default Input Actions 配置文件中的所有動作會被 Input Action Manager 激活,那么系統(tǒng)也會開始監(jiān)聽這些動作所綁定的輸入

我們可以打開 Input Action Manager 腳本:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

可以看到在 OnEnable 的時候,腳本調(diào)用 EnableInput 方法,調(diào)用存儲的 Input Action Asset 的 Enable 方法,因此 Input Action Asset 中的所有 Action 都會被激活,所有 Action 綁定的輸入會被系統(tǒng)監(jiān)聽。

所以,后續(xù)我們?nèi)绻谀_本中引用一個動作,如果該動作所屬的 Input Action Asset 被添加到了 Input Action Manager 中,我們是不需要手動在腳本中激活該動作的。

??XR Controller (Action-based) 腳本

在 XR Origin 下的 LeftHand Controller 和 RightHand Controller 物體上掛載了 XR Controller(Action-based) 腳本。它能將 Input Action Asset 中設定的動作與 VR 中的交互關(guān)聯(lián)起來,以左手為例:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

可以看到在 Reference 中引用了 XRI Default Input Actions 中配置的一些動作,類型為 Input Action Reference。這個腳本通常要和交互功能結(jié)合在一起,才能在監(jiān)聽到設備輸入的時候觸發(fā)交互的功能。VR 中的交互由兩部分組成:發(fā)起交互的對象(Interactor)和可被交互的對象(Interactable)。我們以抓取功能為例,Interactor 相當于虛擬的雙手,對應著手柄,Interactable 就是可以被抓取的物品。在 Unity 中,我們需要給手部添加 XR Direct Interactor 腳本,給物品添加 XR Grab Interactable 腳本(具體的使用方法可以參考這篇教程:Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (六)手與物品交互(觸摸、抓?。?,這樣抓取交互的條件就滿足了,接下來需要解決的是手柄輸入觸發(fā)抓取的問題。假設按下手柄的 Grip 鍵觸發(fā)抓取,剛好我們 XR Controller 腳本中的 Select Action 引用的 Reference 是 Select 動作:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

Select 動作綁定的就是“按下手柄 Grip 鍵”的輸入操作,因此當系統(tǒng)監(jiān)聽到“按下手柄 Grip 鍵”的輸入操作后,便會觸發(fā) XR Controller 的 Select Action。而 在擁有 Interactor 和 Interactable 相關(guān)腳本的條件下,Select 動作的發(fā)生就會讓物體被抓取到手上。這就是 XR Interaction Toolkit 現(xiàn)有腳本調(diào)用 Input System 的一個例子。


?在自己的腳本中引用 Input System 中的動作

有時候,我們需要在自己的腳本中引用 Input System 中的動作,然后編寫這個動作觸發(fā)后執(zhí)行的方法。回想一下 Input System 的結(jié)構(gòu):Input Action Asset => Action Map => Action,我們需要獲取 Action 相關(guān)的類。在 Input System 中,Action 所屬的類叫做 Input Action,首先我們要導入 UnityEngine.InputSystem 命名空間:

using UnityEngine.InputSystem;

然后有以下幾種方法在代碼中獲取它,后續(xù)我們也要得到 InputAction 類的變量,對它進行操作。

??直接引用 Input Action

我們可以直接引用 Input Action 類:

public InputAction testAction;

這樣我們的 Inspector 面板會多出這個東西:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
但是這里需要我們在 Inspector 面板中配置 Action 綁定的輸入操作,無法直接引用 Input Action Asset 配置文件中已經(jīng)配置好的動作輸入映射。所以不推薦大家直接在腳本中引用 InputAction。

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

??引用 InputActionReference(推薦)

public InputActionReference testActionReference;

這個 InputActionReference 類能夠訪問 Input Action Asset 中 Input Action Map 里的 Input Action
此時 Inspector 面板如下:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

我們可以選擇一個 InputActionReference:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
這些就是我們在 Input Action Asset 配置文件里配置的動作。

有了 InputActionReference 類的引用,我們可以通過

testActionReference.action

得到 InputAction 類的變量。

??引用 InputActionProperty(推薦)

public InputActionProperty testActionProperty;

此時 Inspector 面板如下圖所示:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
InputActionProperty 既能夠引用 Input Action Asset 中的動作配置,也能夠在面板中定義動作和輸入的映射關(guān)系。

如果我們勾選了 Use Reference,可以在面板中給 Reference 變量賦值,選擇配置文件中配置好的動作。

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

如果沒有勾選 Use Reference,我們也可以像直接引用 InputAction 后看到的面板那樣,在 Inspector 面板中配置動作和輸入的映射。

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

不過還是推薦大家統(tǒng)一在 Input Action Asset 配置文件中配置動作和輸入的映射關(guān)系,這樣便于管理。

和 InputActionReference 一樣,我們可以通過:

testActionProperty.action

得到 InputAction 類的變量。

??引用 InputActionMap

public InputActionMap testActionMap;

因為 InputAction 的上一層級是 InputActionMap,所以我們也能通過 InputActionMap 來獲取 InputAction

此時 Inpsector 面板如圖所示:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

這里我們就只能在 Inspector 面板中配置動作和輸入的映射。和之前直接引用 InputAction 不同,如果直接引用 InputAction,相當于我們定義了一個動作,然后在面板中配置這個動作綁定的輸入;如果引用 InputActionMap,因為 Action Map 是一組動作輸入映射集,所以我們能在面板中定義一組動作,然后為每一個動作配置綁定的輸入。

接下來我們可以在代碼中通過:

InputAction[] actions = testActionMap.actions.ToArray(); 

獲取一組 InputAction 變量。

但是引用 InputActionMap 同樣也不能訪問 Input Action Asset,所以也不推薦這種用法。

??引用 Input Action Asset(推薦)

public InputActionAsset testActionAsset;

這時候 Inspector 面板如下:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

然后我們可以用 XRI Default Input Actions 文件進行賦值:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

結(jié)合 Input System 的結(jié)構(gòu),我們可以根據(jù)一個 Input Action Asset 找到其中一個 Input Action Map,然后在這個 Input Action Map 中找到一個 Input Action。所以代碼可以這么寫:

 InputAction select = testActionAsset.FindActionMap("XRI LeftHand Interaction").FindAction("Select");

這樣就能夠準確地找到我們想要的動作。雖然 InputActionAsset 類有一個 FindAction 方法:

InputAction select = testActionAsset.FindAction("Select");

但是如果不同的 Input Action Map 含有相同名字的 Input Action,這個 InputActionAsset 下的 FindAction 方法會返回已經(jīng)激活的 Action 中,第一個被找到的 Action。因此還是推薦先用 FindActionMap 找到具體的 Action Map,再用 FindAction 找到具體的 Action。

引用 Input Action Asset 的好處是:之前不管是引用 InputActionReference 還是 InputActionProperty,都需要手動將具體的 Action 賦值到 Inspector 面板中。如果你喜歡用純代碼的方式找到具體的 Action,可以嘗試引用 Input Action Asset,然后用 FindActionMap 和 FindAction 方法找到具體的 Input Action

?將動作與動作觸發(fā)時執(zhí)行的方法進行關(guān)聯(lián)

能夠得到 InputAction 類的變量后,相當于連接了 Input System 和我們的腳本。接下來只剩下編寫動作觸發(fā)時需要執(zhí)行的方法,將其與動作進行關(guān)聯(lián)。這種情況適用于 Action Type 為 Button 的動作,因為只有“動作觸發(fā)”和“動作沒觸發(fā)”兩種狀態(tài),當輸入發(fā)生,比如某個按鍵按下的時候,觸發(fā)動作,執(zhí)行相應的行為。

現(xiàn)在假設我們有一個需求:按下左手柄 Grip 鍵的時候在控制臺輸出一句話。
我這里選擇引用 InputActionReference 的方式。

??方法一:將執(zhí)行的方法綁定到 performed 委托上(推薦)

using UnityEngine;
using UnityEngine.InputSystem;

public class XRInputTest : MonoBehaviour
{
    public InputActionReference testActionReference;
    //public InputActionProperty testActionProperty;
    //public InputActionMap testActionMap;
    //public InputActionAsset testActionAsset;

    private InputAction testAction;
    void Start()
    {
        testAction = testActionReference.action;
        testAction.performed += ActivateBehavior;
    }

    private void ActivateBehavior(InputAction.CallbackContext context)
    {
        print("執(zhí)行方法");
    }
}

我們需要將動作觸發(fā)時執(zhí)行的方法綁定到 InputAction 類的 performed 委托中:

testAction.performed += ActivateBehavior;

performed 委托會在動作觸發(fā)完成后調(diào)用,它是一個
Action<InputAction.CallbackContext> 類型的委托,所以綁定的方法需要將 InputAction.CallbackContext 作為方法參數(shù)。

因為我的需求是監(jiān)聽“按下手柄 Grip 鍵”的操作,這與 XRI Default Input Actions 配置文件中的 XRI LeftHand Interaction (Action Map)下的 Select 動作(Action)相匹配。所以我們在 Inspector 面板中進行賦值:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
運行程序,當我們按下左手柄 Grip 鍵的時候,如果在控制臺能看到輸出,說明我們成功了。

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

??方法二:通過 action.triggered 判斷是否觸發(fā)

我們也可以這樣寫代碼:

using UnityEngine;
using UnityEngine.InputSystem;

public class XRInputTest : MonoBehaviour
{
    public InputActionReference testActionReference;
    //public InputActionProperty testActionProperty;
    //public InputActionMap testActionMap;
    //public InputActionAsset testActionAsset;

    private InputAction testAction;
    void Start()
    {
        testAction = testActionReference.action;
    }
    private void Update()
    {
        if (testAction.triggered)
        {
            print("執(zhí)行方法");
        }
    }

}

testAction.triggered 是一個 bool 變量,當動作觸發(fā)時,返回 true,這時候可以執(zhí)行動作觸發(fā)時做的事情。但是這種寫法將要過時,還是推薦大家使用第一種方法。

?獲取輸入的值(ReadValue<T>)

這種情況一般適用于 Action Type 為 Value 或者 Pass through 的動作。以獲取按下左手柄 Grip 鍵的程度為例,我想獲取按下左手柄 Grip 鍵對應的值,可以這么做:

using UnityEngine;
using UnityEngine.InputSystem;

public class XRInputTest : MonoBehaviour
{
    public InputActionReference leftGripActionValueReference;
    private InputAction leftGripActionValue;
    void Start()
    {
        leftGripActionValue = leftGripActionValueReference.action;
    }
    private void Update()
    {
        GetGripValue();
    }
    private void GetGripValue()
    {
        float value = leftGripActionValue.ReadValue<float>();
        print($"value:{value}");
    }   
}

通過 InputAction 類下的 ReadValue<T> 方法獲取輸入的值,Grip 鍵按下的程度可以用一個 float 類型的數(shù)來表示。

在 XRI Default Input Actions 配置文件中,XRI LeftHand Interaction (Action Map)下的 Select Value 動作(Action)能獲取按下左手柄 Grip 鍵對應的值,該動作的 Action Type 為 Value

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

?在 Input Action Asset 中添加自定義的動作輸入映射

接下來我將演示如何在 在 Input Action Asset 中添加自定義的動作輸入映射。

我使用的是 Quest 2,那么就來演示一下按下左手柄 X 鍵時控制臺輸出一句話。

首先打開 XRI Defalut Input Actions 文件,我們直接在官方為我們準備的 Input Action Asset 里操作。因為配置文件中默認沒有“按下左手柄 X 鍵”相關(guān)的動作,所以我們需要手動添加自定義的動作。我選擇在 XRI LeftHand Interaction 這個 Action Map 中添加一個新的動作,將它命名為 PrimaryButton。

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
確保右側(cè)面板的 Action Properties 中的 Action Type 為 Button,因為我們檢測的是按鍵是否被按下。

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr
接著點擊動作下方的這個 Binding,點擊右側(cè)面板的 Path,選擇 XR Controller:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

選擇 XR Controller (LeftHand):

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

選擇 Optional Controls:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

選擇 primaryButton,這個 primaryButton 對應左手柄的 X 鍵或者右手柄的 A 鍵;而 secondaryButton 對應 左手柄的 Y 鍵或者右手柄的 B 鍵。大家也可以自行嘗試 Optional Controls 里的其他選項,基本涵蓋了手柄的所有輸入。

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

最后別忘了點擊面板上方的 Save Asset 進行保存:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

然后編寫相關(guān)代碼:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class XRInputTest : MonoBehaviour
{
    public InputActionReference testActionReference;    
    private InputAction testAction;

    void Start()
    {
        testAction = testActionReference.action;

        testAction.performed += ActivateBehavior; 
    }


    private void ActivateBehavior(InputAction.CallbackContext context)
    {
        print("執(zhí)行方法");
    }    
}

在 Inspector 面板中賦值:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr

現(xiàn)在運行程序,當我按下左手柄的 X 鍵時,控制臺就會輸出一段語句:

Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入,# XR Interaction Toolkit 實戰(zhàn),unity,vr,xr


??總結(jié)

XR Interaction Toolkit 推薦使用 Unity 的 Input System 來接收設備的輸入。它將輸入設備和動作邏輯互相分離,通過配置映射來處理輸入信息。我們只需要提前配置好動作和輸入的映射關(guān)系,在代碼中把重心放在邏輯處理上,也就是檢測到輸入后要做的事情,將其與配置的動作相關(guān)聯(lián)。而設備輸入的監(jiān)聽交給了系統(tǒng)本身。當監(jiān)聽到設備輸入時,視為觸發(fā)了輸入所綁定的動作,便會觸發(fā)動作發(fā)生后需要做的事情。

總的來說使用起來分為這幾個階段:編輯配置文件,關(guān)聯(lián)腳本與配置文件中的動作,編寫接收到輸入時執(zhí)行的邏輯。

Input System 需要有一個 Input Action Asset 配置文件,Input Action Asset 可以存儲多個 Input Action Map,每一個 Action Map 相當于一組動作輸入映射集,每一個 Action Map 存儲的動作(Input Action)能夠綁定一至多個輸入操作。

配置好動作和輸入的映射關(guān)系后,我們需要在腳本中獲取 InputAction 類的變量,才能訪問配置文件中對應的動作。然后可以將動作觸發(fā)時執(zhí)行的方法綁定到 InputAction 類的委托上,這樣就能在接收到設備輸入時執(zhí)行相應的邏輯;或者使用 InputAction 類的 ReadValue<T> 方法獲取輸入的值。文章來源地址http://www.zghlxwxcb.cn/news/detail-663426.html

到了這里,關(guān)于Unity VR:XR Interaction Toolkit 輸入系統(tǒng)(Input System):獲取手柄的輸入的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Unity之OpenXR+XR Interaction Toolkit實現(xiàn) 監(jiān)聽VR手柄按鍵

    Unity之OpenXR+XR Interaction Toolkit實現(xiàn) 監(jiān)聽VR手柄按鍵

    當我們接入XR Interaction Toolkit之后,我們可以很方便的做不同VR設備的適配,這在很大程度上提升了我們的開發(fā)效率,我們除了通過射線和物體交互之外,偶爾我們也會希望監(jiān)聽手柄上的部分按鍵的點擊事件,今天我們就來實現(xiàn)如何監(jiān)聽VR手柄的按鈕事件。 我們需要準備好Uni

    2024年02月05日
    瀏覽(90)
  • Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (二) 手部動畫

    Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (二) 手部動畫

    此教程相關(guān)的詳細教案,文檔,思維導圖和工程文件會放入 Spatial XR 社區(qū) 。這是一個高質(zhì)量知識星球 XR 社區(qū),博主目前在內(nèi)擔任 XR 開發(fā)的講師。此外,該社區(qū)提供教程答疑、及時交流、進階教程、外包、行業(yè)動態(tài)等服務。 社區(qū)鏈接: Spatial XR 高級社區(qū)(知識星球) Spatial

    2024年02月11日
    瀏覽(24)
  • Unity之OpenXR+XR Interaction Toolkit如何自定義VR按鍵

    Unity之OpenXR+XR Interaction Toolkit如何自定義VR按鍵

    上一篇文章我們介紹了Unity的新版本InputSyste如何使用,這一篇文章,我們主要說一下,在新版基于OpenXR的VR項目中,如何自定義VR按鈕的功能。 我們使用XR Interaction Toolkit插件時,它的幾個Samples是非常有用的。如下所示: 它們分別是: 1.Starter Assets:官方示例Demo 2.XR Device Simul

    2024年02月15日
    瀏覽(38)
  • Unity VR開發(fā)教程 OpenXR+XR Interaction Toolkit(七)射線抓取

    Unity VR開發(fā)教程 OpenXR+XR Interaction Toolkit(七)射線抓取

    此教程相關(guān)的詳細教案,文檔,思維導圖和工程文件會放入 Spatial XR 社區(qū) 。這是一個高質(zhì)量知識星球 XR 社區(qū),博主目前在內(nèi)擔任 XR 開發(fā)的講師。此外,該社區(qū)提供教程答疑、及時交流、進階教程、外包、行業(yè)動態(tài)等服務。 社區(qū)鏈接: Spatial XR 高級社區(qū)(知識星球) Spatial

    2023年04月08日
    瀏覽(27)
  • Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (五) UI

    Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (五) UI

    此教程相關(guān)的詳細教案,文檔,思維導圖和工程文件會放入 Spatial XR 社區(qū) 。這是一個高質(zhì)量知識星球 XR 社區(qū),博主目前在內(nèi)擔任 XR 開發(fā)的講師。此外,該社區(qū)提供教程答疑、及時交流、進階教程、外包、行業(yè)動態(tài)等服務。 社區(qū)鏈接: Spatial XR 高級社區(qū)(知識星球) Spatial

    2024年02月11日
    瀏覽(25)
  • Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit(八)手指觸控 Poke Interaction

    Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit(八)手指觸控 Poke Interaction

    此教程相關(guān)的詳細教案,文檔,思維導圖和工程文件會放入 Spatial XR 社區(qū) 。這是一個高質(zhì)量知識星球 XR 社區(qū),博主目前在內(nèi)擔任 XR 開發(fā)的講師。此外,該社區(qū)提供教程答疑、及時交流、進階教程、外包、行業(yè)動態(tài)等服務。 社區(qū)鏈接: Spatial XR 高級社區(qū)(知識星球) Spatial

    2024年02月12日
    瀏覽(25)
  • Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (三) 轉(zhuǎn)向和移動

    Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (三) 轉(zhuǎn)向和移動

    此教程相關(guān)的詳細教案,文檔,思維導圖和工程文件會放入 Spatial XR 社區(qū) 。這是一個高質(zhì)量知識星球 XR 社區(qū),博主目前在內(nèi)擔任 XR 開發(fā)的講師。此外,該社區(qū)提供教程答疑、及時交流、進階教程、外包、行業(yè)動態(tài)等服務。 社區(qū)鏈接: Spatial XR 高級社區(qū)(知識星球) Spatial

    2024年02月11日
    瀏覽(28)
  • Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (一) 安裝和配置

    Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (一) 安裝和配置

    此教程相關(guān)的詳細教案,文檔,思維導圖和工程文件會放入 Spatial XR 社區(qū) 。這是一個高質(zhì)量知識星球 XR 社區(qū),博主目前在內(nèi)擔任 XR 開發(fā)的講師。此外,該社區(qū)提供教程答疑、及時交流、進階教程、外包、行業(yè)動態(tài)等服務。 社區(qū)鏈接: Spatial XR 高級社區(qū)(知識星球) Spatial

    2024年02月11日
    瀏覽(18)
  • Unity之OpenXR+XR Interaction Toolkit接入Pico VR一體機

    Pico VR 一體機是目前國內(nèi)比較流行的VR設備之一,PICO成立于2015年3月,于2021年9月并入字節(jié)跳動。最新推出的Pico4一體機售價只有2400左右,這讓很多家庭都入手了Pico設備,VR一體機的功能包括:VR全景視頻,VR運動,VR游戲等等。我們今天就來通過Unity最新的OpenXR標準來接入Pico

    2024年02月04日
    瀏覽(30)
  • VRIK+Unity XR Interaction Toolkit 配置 VR 全身模型(下):實現(xiàn)腿部行走動畫

    VRIK+Unity XR Interaction Toolkit 配置 VR 全身模型(下):實現(xiàn)腿部行走動畫

    此教程相關(guān)的詳細教案,文檔,思維導圖和工程文件會放入 Spatial XR 社區(qū) 。這是一個高質(zhì)量知識星球 XR 社區(qū),博主目前在內(nèi)擔任 XR 開發(fā)的講師。此外,該社區(qū)提供教程答疑、及時交流、進階教程、外包、行業(yè)動態(tài)等服務。 社區(qū)鏈接: Spatial XR 高級社區(qū)(知識星球) Spatial

    2024年02月10日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包