[AR/VR教程] SteamVR Unity工具包(三):控制器交互

可交互對象(VRTK_InteractableObject)
app


可交互對象腳本被添加到須要用(如控制器)來交互的任何遊戲對象上。

可用腳本參數以下

Touch Interactions 觸摸交互
編輯器

· Highlight On Touch:若是勾選,這個對象在控制器觸摸它時就會高亮。
· Touch Highlight Color:對象被觸摸時高亮的顏色。顏色能夠被任何全局的設置顏色來覆寫(例如InteractTouch 腳本)。
· Rumble On Touch:控制器觸碰對象時觸發振動反饋,x代表時長,y代表震動強度。(x和y未來會被自定義編輯器代替)。

Grab Interactions 抓握交互
ide

· Is Grabbale:決定對象是否能被抓握。
· Is Droppable:決定對象在被控制器抓握後可否被放下。若是沒有勾選,一旦用控制器按鈕拾起了物品就不能放下了。可是若是抓握的機制是關節(Fixed_Joint)的話,當對象受力足夠大以後關節斷開,物品也就被放下了。因此最好使用控制器子物體的抓握機制(Child_Of_Controller)來防止這種狀況。
· Hold Button To Grab:若是勾選,控制器就須要持續按住設置爲抓握的按鈕來保持抓握狀態。若是沒有勾選,抓握的按鈕切換抓握行爲經過按下一次抓取,再按一次釋放。
· On Grab Collision Delay當對象被第一次抓取時延遲碰撞的做用的時間量。這在防止遊戲對象被抓取時卡到另一個物體時頗有用。
· Grab Snap Type(抓取對齊方式):這個設置了當對象唄抓取時的對齊方式
     o Sinmple_Snap把抓取的對象的中心位置放到控制器的附加點上(默認是控制器的tip)
     o Rotation_Snap 調整抓取的對象到一個指定旋轉,由Vector3 類型的Snap To Rotation變量提供。
     o Precision_Snap 沒有把對象的位置對齊到控制器,而是用控制器觸摸對象時的點來拾起對象(就像真實生活中用手拿起東西同樣)。
     o Handle_Snap 容許一個空的GameObject做爲可交互對象的子物體來用做參考對齊點。抓取時,空GameObject的旋轉和位置用來定位抓取的可交互物體到控制器。
· Snap To Rotation:表示歐拉角的Vector3變量,決定在對齊時相對於控制器的對象的旋轉。在拾取槍或劍的時候頗有用,對控制器的相對旋轉對便於使用是很重要的。
· Snap To Position:一個Vector3變量,決定對象對齊控制器時的相對位置。
· Snap Hanlde:一個由空遊戲對象提供的Transform,它必須是被抓取物品的子物體並用做一個被拾取物品相對於進行抓取的控制器的旋轉和位置的定位點。
· Rumble On Grab:控制器抓取對象時觸發振動反饋,x代表時長,y代表震動強度。(x和y未來會被自定義編輯器代替)。


Grab Mechanics 抓握機制
spa

· Grab Attach Type:這決定了抓取的物品在被抓取時怎樣被添加到控制器上。


      o Fixed Joint(固定關節)用一個固定的關節把對象附加到控制器上,意味着附加對象以徹底1:1的方式追蹤控制器的位置和旋轉。
     o Spring Joint(彈性關節)用一個彈性關節把對象添加到控制器上,意味着物體和控制器之間有一些彈性,彈力驅動物體。在想要牽引一個物體而不是直接把物體對齊到控制器上是頗有效的。就感受物體有運動阻力通常。
     o Track Object (追蹤對象)不是經過關節來把對象附加到控制器上,而是確保對象追蹤控制器的方向,這適用於鉸鏈式關節。
     o Child Of Controller (控制器子物體)簡單地讓對象成爲抓取控制器的子物體,因此天然地追蹤了控制器運動位置。


· Detach Threshold(分離閾值):當對象從被抓取的控制器分離時的力值。若是控制器試着施加一個高於這個閾值的力到對象上(從另外一個對象上拉它或者推它到另外一個對象),而後保持對象到抓取控制器的關節就將斷開而且對象將不能再被抓起了。這在Tracked Object抓取機制下也有效,只是這個 值肯定斷開抓取錢控制器能夠離對象多遠。
· Spring Joint Strength(彈簧關節力):彈簧力保持對象到控制器。小數值將意味着彈簧很鬆而且對象須要一個更大的力去移動,大數值就意味着彈簧很緊,小點的力就能夠移動它。
· Spring Joint Damper(彈簧關節阻尼):彈簧的阻尼量在使用彈簧關節抓取機制下有效。在移動被關節的交互對象時,值越高震動效果越小。
· Throw Muliplier(投擲倍數):值用來乘以給定對象被扔出時的速度值。這還能夠被用來連同Interact Grab腳本的Throw Multiplier來讓對象被扔的比日常更遠(或者輸入的值小於1就扔的很近)。


Use Interactions 使用交互
指針

· Is Usable(是否可用):決定對象是否能夠被使用
· Hold  Button To Use:若是勾選,控制器上的使用(use)按鈕須要被持續按下來保持使用。若是沒有勾選,use按鈕用一次按鈕按下來啓動使用和再一次按下來中止使用。
· Pointer Avtivates Use Action:若是勾選,當一個世界光束指針(由控制器投射)碰到了交互對象,若是對象的Hold Button To Use沒有勾選的話,當指針在對象上的時候就會運行對象的StartUsing方法,指針移開失效就會運行StopUsing方法。這個選項在被勾選之後,爲了防止在用一個指針來使用對象時發生沒必要要的傳送,就不會拋出目標點設置( Destination Set )事件。
· Rumble On Use: 控制器觸碰對象時觸發振動反饋,x代表時長,y代表震動強度。(x和y未來會被自定義編輯器代替)。


下面的事件是被髮送的:
· InteractableObjectTouched當另外一個對象碰到當前對象時發出事件。
· InteractableObjectUntouched: 當其餘對象中止觸碰當前對象時發出事件。
· InteractableObjectGrabbed當其餘對象(如控制器)抓握當前對象時發出事件。
· InteractableObjectUngrabbed當其餘對象中止抓握當前對象時發出事件。
· InteractableObjectUsed當其餘對象(控制器)使用當前對象時發出事件。
· InteractableObjectUnused當其餘對象中止使用當前對象時發出事件。


發出的事件有效信息載體包涵:
· interactingObject初始化交互的對象(如控制器)。

腳本基本是提供一個簡單的機制來區分遊戲世界中的對象是否能被抓取或者使用,最好是把這個腳本看作是一個基類來派生出功能更豐富的腳本。

VRTK_InteractableObject 的例子能夠看SteamVR_Unity_Toolkit/Examples/005_Controller_BasicObjectGrabbing.場景。這個場景還在控制器上使用了VRTK_InteractTouch和VRTK_InteractGrab 腳本,來展現一個交互對象怎樣被抓取和對齊到控制器以及在遊戲世界中扔出。


另一個例子在場景SteamVR_Unity_Toolkit/Examples/013_Controller_UsingAndGrabbingMultipleObjects。這個場景展現了更多對象,能夠被按住按鈕抓取或者切換按鈕點擊來抓取的對象,還有對象經過切換它們的Using 狀態來展現多種物品可同時被開啓。


Touching Interactable Objects (VRTK_InteractTouch)
orm

觸摸交互腳本被添加到[CameraRig] 預製裏的控制器對象上。

可用參數以下:
· Hide Controller On Touch: 當有效觸碰發生時隱藏控制器模型
· Hide Controller Delay:觸摸隱藏控制器以前的等待秒數。
· Global Touch Highlight Color: 若是交互對象被觸碰就能高亮顯示,沒有設置本地顏色的話就使用全局顏色。


發出事件以下:
· ControllerTouchInteractableObject當有效對象被碰到時發出
· ControllerUntouchInteractableObject: 當一個有效對象再也不被觸碰時發出

發出事件有效載體信息包含:
· controllerIndex控制器序號:正在交互的控制器的序號
· Target(目標): 控制器正在交互的對象的GameObject

VRTK_InteractTouch 的例子參見SteamVR_Unity_Toolkit/Examples/005_Controller/BasicObjectGrabbing場景。場景演示了添加了 VRTK_InteractableObject 腳本的對象被控制器觸碰時可以高亮顯示交互對象的能力。

抓取交互對象(VRTK_InteractGrab)
對象

交互抓取腳本被添加到[CameraRig] 預製裏的控制器對象上,而且須要添加VRTK_ControllerEvents腳本用來監聽抓取和釋放交互遊戲對象的控制器按鈕事件。它監聽AliasGrabOn和AliasGrabOff 事件來肯定對象合適應該被抓取和釋放。

控制器對象也須要添加VRTK_InteractTouch 腳本用來肯定什麼時候一個可交互對象被觸摸到。只有有效的被觸摸對象才能被抓取。

若是控制器觸碰到一個包含VRTK_InteractableObject腳本而且isGrabbable 標誌位設置爲真的遊戲對象,該對象就能夠被抓取。

若是有效可交互對象是可抓取的,按下控制器上所設置的抓取按鈕(默認是Trigger按鈕)將抓取和對齊對象到控制器上,而且直到抓取按鈕鬆開纔會被釋放。

當控制器抓取按鈕鬆開時,若是可交互對象是可抓取的,它將會被按必定速率沿着控制器鬆開時的方向進行推進,這就模擬了對象投擲。

可交互對象須要碰撞體用來激活觸發和一個剛體用來拾取它們並在遊戲世界中四處移動它們。


可用腳本參數以下:
· ************************************************************
· Controller Attach Point:控制器模型上用來吸附抓取的對象的剛體點(默認爲tip)
· Hide Controller On Grab: 當有效抓取發生時隱藏控制器模型。
· Hide Controller Delay:在抓取時隱藏控制器以前的等待時間秒數。
· Grab Precognition預先抓取: 在抓取按鈕按下時和控制器正在抓取某個東西時之間時間量。例如,若是一個對象下落過快,由於人的反應時間可能很難及時按下抓取按鈕來抓住對象。這個值越高意味着抓取鍵能夠越提早在控制器碰到對象以及碰撞發生前按下,若是抓取鍵仍然被按下(若是抓取對象須要持續按鍵抓取的話),則抓取動做就會成功。
· Throw Multiplier(投擲乘數):用來乘以對象被扔出時速度的量。在放大 CameraRig 來模擬可以把物體扔的更遠時是頗有用的。
· Create Rigid Body When Not Touching:若是勾選,當抓取按鈕按下時,若是控制器沒有碰到一個可交互的對象,那麼添加到控制器上的剛體就容許控制器去推進周圍其餘的剛體對象。


發出事件以下:
· ControllerGrabInteractableObject: 當有效對象被抓取時發出
· ControllerUngrabInteractableObject: 當有效對象從抓取到放開時發出

發出事件有效載體信息包含:
· controllerIndex: 正在交互的控制器序號
· target: 控制器正在交互的對象的GameObject


VRTK_InteractGrab的例子能夠參見SteamVR_Unity_Toolkit/Examples/005_Controller/BasicObjectGrabbing場景。場景演示了抓取掛有VRTK_InteractableObject 腳本的可交互對象。對象可拾起可拋出。

更復雜一點的例子能夠參見場景SteamVR_Unity_Toolkit/Examples/013_Controller_UsingAndGrabbingMultipleObjects ,這裏演示了每一個控制器都能單獨抓取和使用對象而且對象也能夠被同時切換它們的使用狀態。SteamVR_Unity_Toolkit/Examples/014_Controller_SnappingObjectsOnGrab場景演示了不一樣的對齊抓取的對象到控制器上的機制。

使用可交互對象(VRTK_InteractUse)
遊戲

交互使用腳本被添加到[CameraRig] 預製裏的控制器對象上,而且須要添加VRTK_ControllerEvents腳本用來監聽使用和中止使用交互遊戲對象的控制器按鈕事件。它監聽AliasUseOn 和AliasUseOff 事件來肯定對象合適應該被使用和中止使用。


控制器對象也須要添加VRTK_InteractTouch腳原本決定什麼時候可交互對象被觸碰。只有有效的觸碰對象才能被使用。

若是控制器觸碰到一個包含VRTK_InteractableObject 腳本且isUsable標誌位設置爲真,這個對象就能被使用。


可用腳本參數以下:
· Hide Controller On Use:當有效使用動做開始時隱藏控制器模型
· Hide Controller Delay:在使用以前,隱藏控制器的等待時間秒數

發出事件以下:
· ControllerUseInteractableObject: 當一個有效對象開始被使用時發出
· ControllerUnuseInteractableObject: 當一個有效對象中止被使用時發出

發出的事件的有效載體信息包含:
· controllerIndex: 正在交互的控制器序號
· target: 控制器正在交互的對象的GameObject

例子參見SteamVR_Unity_Toolkit/Examples/006_Controller_UsingADoor場景,模擬打開一扇門和關上。地上也有一個立方體能夠被抓取來展現可交互對象怎麼被使用或者抓取。

另外一個例子可參見SteamVR_Unity_Toolkit/Examples/008_Controller_UsingAGrabbedObject場景,它展現了對象能夠用一個按鈕抓取並用另外一個按鈕使用。

自動抓取可交互對象(VRTK_ObjectAutoGrab)
事件

經過把VRTK_ObjectAutoGrab腳本加到控制器上並指定應該默認抓取的對象,來讓特定控制器能自動抓取可交互對象。

自動抓取對象腳本添加到[CameraRig] 預製裏的控制器對象上,控制器對象還須要添加VRTK_InteractGrab 腳本。

可用腳本參數以下:
· Object To Grab(抓取的對象):在遊戲開始時被控制器抓取的遊戲對象(在場景或者預製裏)。
· Clone Grabbed Object複製被抓取對象:若是勾選,Object To Grab(抓取的對象)將被複制到一個新對象並添加到控制器上,而被複制的對象留在場景裏。這在兩個控制器都須要抓取一樣的對象時是須要的,由於單個對象不能被不一樣的控制器同時抓取。若是被抓取的對象是一個預製就也須要被複制,由於它須要存在於場景中被抓取。

例子參見SteamVR_Unity_Toolkit/Examples/026_Controller_ForceHoldObject場景。這裏每一個控制器自動抓取了一把劍,同時爲了防止劍被扔掉,劍被永久的添加到用戶的控制器上。
相關文章
相關標籤/搜索