SteamVR Unity工具包(VRTK)控制器交互

可交互對象(VRTK_InteractableObject)


 

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

可用腳本參數如下
 

Touch Interactions 觸摸交互

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

Grab Interactions 抓握交互

· 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 抓握機制

· 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 狀態來展示多種物品可同時被開啓。

 

 


觸摸交互對象(VRTK_InteractTouch)


 

觸摸交互腳本被添加到[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(抓取的對象)將被複制到一個新對象並添加到控制器上,而被複制的對象留在場景裏。這在兩個控制器都需要抓取同樣的對象時是需要的,因爲單個對象不能被不同的控制器同時抓取。如果被抓取的對象是一個預製就也需要被複制,因爲它需要存在於場景中被抓取。
發佈了28 篇原創文章 · 獲贊 29 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章