1. 程式人生 > >SteamVR Unity工具包(VRTK)之控制器互動

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(抓取的物件)將被複制到一個新物件並新增到控制器上,而被複制的物件留在場景裡。這在兩個控制器都需要抓取同樣的物件時是需要的,因為單個物件不能被不同的控制器同時抓取。如果被抓取的物件是一個預製就也需要被複制,因為它需要存在於場景中被抓取。  

例子參見SteamVR_Unity_Toolkit/Examples/026_Controller_ForceHoldObject場景。這裡每個控制器自動抓取了一把劍,同時為了防止劍被扔掉,劍被永久的新增到使用者的控制器上

原文連結:http://www.cnblogs.com/unity3ds/p/5811011.html