Unity Steam_VR開發工具插件---VRTK 自帶案例分析

DEMO 1  查詢硬件手柄頭顯

VRTK插件 的第一個demo   001_CameraRig_VR_PlayArea 案例

 

這個demo 顯示的功能 按下任一手柄上的按鍵,便載入下一個場景

 

找到demo場景中##Scene Changer## 遊戲物體,打開附加的scene changer腳本

裏面有兩個核心的類,以及幾個重要的API

 VRTK_DeviceFinder : 用於在場景中尋找左右手柄,頭顯,返回硬件編號


或手柄,頭顯的gameobject


重要的API  :  

獲得左右手柄的遊戲物體

VRTK_DeviceFinder.GetControllerRightHand(); 

VRTK_DeviceFinder.GetControllerLiftHand();


獲得左右手柄對應的硬件編號

VRTK_DeviceFinder.GetControllerIndex(rightHand)


按下手柄任一按鍵或鍵盤上的空格鍵,加載下一個場景

ForwardPressed 用於偵測手柄的按鍵是否按下



上圖中引入第二個重要的類: VRTK_SDK_Bridge

這是插件封裝了steam VR 的比較底層的API:

 

VRTK_SDK_Bridge.IsTriggerPressedOnIndex(controllerIndex) 

輸入硬件的編號,返回是否按下的布爾值.

DEMO 2手柄的輸入事件

封裝成VRTK_ControllerEvent腳本


針對VR中常見的交互動作 UI點擊, 抓住物體, 觸發物體功能 , 自定義手柄按鍵,綁定這些動作.


pointerToggleButton :激光的顯示開關, 激光在VR裏相當於鼠標箭頭的指向功能.

pointerSetButton: 激光停留的指向目標,觸發目標的功能  相當於鼠標點擊;

grabToggleButton:  抓住物體動作 配合使用VRTK插件集成的抓取,投擲功能.

useToggleButton:  觸發目標事件 比如把手柄放在門把手上,按下這個按鍵,觸發門打開的功能,手柄放在電燈開關上,按下按鍵,觸發電燈開發的功能.

這個和pointerSetButton區別在於後者需要激光落在目標上,才能觸發目標上的功能

uiClickButton :觸發UI Canvas 目標的事件

menuToggleButton: 遊戲目錄顯示開關

axisFidelity:  按鍵按下的強度,完全按下是1,鬆開時是0,   現在只有Trigger按鍵(手部後面扳機)有此屬性

triggerClickThreShold:  扳機要到多大程度,才能使用扳機的觸發功能  如果是0.5 ,則表示只要按下一半的程度就可以觸發,如果是1,則必須完全按下才能觸發.


以上是設置各個按鍵在插件中交互的功能

 

如果要獲得每個按鍵具體的使用情況,如按下,鬆開按鍵,手觸摸板的按鍵位置,扳機的按下強度,則需要在VRTK_ControllerEvent註冊對應按鍵的事件

 

VRTK_ControllerEvents_ListenerExample腳本中,監聽了VRTK_ControllerEvent所有按鍵的事件,和按鍵的參數信息

 

 下圖見圖的扳機鍵的按鍵事件


事件的參數是


手柄的硬件編號, 按鈕的按下程度值(扳機鍵專有的屬性), 觸摸板的觸摸位置和角度(觸摸板專有的屬性)

 

 

DEMO 003_Controller_SimplePointer

傳送位置

VRTK_Simple Pointer

該腳本繼承自VRTK_WorldPointer


功能的核心是將玩家的位置傳送到激光所指落在的地方,

 

該腳本應默認放在手柄的prefab

其他的參數設置激活顏色,傳送時是否顯示玩家活動區域, 激光有效觸碰的層,激光的粗細等

 

DEMO 004_CameraRig_BasicTeleport

VRTK_BasicTeleport

該腳本配合繼承自VRTK_WorldPointer的子類 VRTK_Simple Pointer,  添加此腳本後纔可以位移傳送


參數

1: 傳送時黑屏   模擬眨眼動畫,過渡更自然

2: 黑屏時間  隨傳送距離遠近成正比的黑屏時間   假如傳送的位置比較遠,則黑屏時間更久, 數值越大,黑屏時間越長,數值爲0,不受距離遠近影響

3: 頭部位置   以頭部爲基準,作爲傳送的位置 未打鉤,則是玩家可玩區域的中心位置作爲傳送的目標點  可玩區域不能和遊戲環境交叉.最大化玩家活動空間

4:禁止傳送物體的標籤  如果傳送的目標位置的物體標籤和此相同,則不能傳送

5:作爲第四個功能的補充  可以添加VRTK_TagOrScriptPolicyList腳本中添加多個禁止傳送的物體標籤


6           navemesh 邊緣限制   navemesh上傳送,如果在navemesh的邊界,則禁止傳送,數值是離邊界的距離範圍.

    

 

DEMO 005_Controller_BasicObjectGrabbing

抓取物體

 

手柄上添加的組件


VRTK_InteractGrab

 

這個腳本用來抓取物體, 抓的按鍵在VRTK_ControllerEvent 腳本中設置

controllerAttachPoint:   被抓的物體,被附加在哪個物體上 默認是手柄的圓環處

HideController On Grab  抓住物體時,隱藏手柄

Hide Controller Delay   延遲幾秒後隱藏手柄

Grab Precognition   提前預判抓取物體   對應快速運動的物體,我們可能需要提早按下抓取按鍵才能抓住物體, 數值是提前的時間值,值越大, 可提前的抓取時間越長

 

Throw Multiplier: 把物體扔出去時,速度的倍增值

Create Rigid Body When Not Touch :  在碰到物體時才創建RigidBody    默認情況下手柄也創建Rigidbody,這就可以和物體在物理上

碰撞.

 

VRTK_InteractTouch

和物體接觸

 

Hide Controller On Touch  接觸物體時隱藏物體

Hide Controller Delay :  接觸物體後延遲幾秒後隱藏物體

 

Global Touch HighLight Color 如果被接觸的物體上未設置接觸高亮顏色,則用此顏色來對改變目標的顏色

 

Custom RigidBody Object 自定義用於判定接觸的剛體物體, 如果沒有的話,會自動在子層級創建一個剛體物體

 

交互物體上應該添加的腳本



VRTK_InteractableObject  需要有rigidbody組件和collider組件

 

1 Touch options   接觸

HighLight OnTouch 接觸時高亮顯示物體顏色

Touch HightLight Color 高亮的顏色

Rumble On Touch 接觸時的反饋震動   強度和時間

Allow Touch Controller   規定哪個手柄可以接觸這個物體

Hide Controller On Touch  覆蓋是否隱藏手柄的設置   default是根據手柄的設置

 

 

2 Grab Options   抓取

IsGrabbable  是否可以被抓取

Is droppable 鬆開時是否掉落

Is swappable 是否可替換  如果不行 則必須先把物體丟掉

Hold Button To Grab 按住才能保證物體不掉落

 

Grab Override Button 覆蓋手柄的抓取按鍵設置

Rumble On Touch 接觸時震動 同上

Allowed Grab Controllers規定哪個手柄可以接觸這個物體

 

Precision Grab 精準抓取   如果是,則抓取的位置是剛接觸到物體的點,而不是默認的物體中心位置

Right Left Snap Handle 被抓物體的抓取點, 該遊戲物體應該放在被抓物的子層級下

 

StayGrabbed On Teleport 傳送後仍然抓住物體 否則物體丟掉

 GrabAttach Mechanic  被抓物體的依附機制  Fixed_joint  鏈接到fixed Joint ,這是比較常用的物理上的固定位置鏈接 

Spring_joint Fixed Joint類似 但是有點手臂關節,可以拉伸彎曲伸直  track Object  不靠joint 鏈接 而是讓被抓物跟隨手柄的位置方向

 rotator _Track 比較適合門,車駕駛把手這種 有固定轉軸的物體,它只能在受轉軸的約束下,根據手柄的抓取位置來調整旋轉, child of controller 作爲手柄的子物體, climbable  固定不動的交互物體

 

 

3 Use options   使用

Use only if Grabbed  只有在被抓取時纔可以被使用

Hold Button to Use 長按手柄按鍵纔可以使用

Use Override Button 自定義操作按鍵

Pointer activates Use Action  如果打鉤  當手柄發射的激光落在交互物體上,於此同時如果Holon to use沒有打鉤,則使用該物體 Holon to use打鉤了,則要按住使用按鍵纔可以使用該物體


該腳本可以 爲交互物體增加一個外輪廓顏色

 

VRTK_InteractableObject擴展

DEMO 006_Controller_UsingADoor

 

該例子用了一個開門的交互來擴展VRTK_InteractableObject 腳本


接觸VRTK_InteractableObject

 

覆蓋開始使用物品的方法

在此方法中寫入交互動作的邏輯方法

 

此外還有


物體被接觸時,抓取時,接觸接觸,結束抓取動作發生時調用的函數,

 

可以覆蓋此方法,自定義擴展你的交互動作.

 

注意

手柄上應該添加下圖腳本,否則無法使用物體


DEMO 007_CameraRig_HeightAdjustTeleport  

高度升降傳送


此腳本繼承VRTK_BasicTeleport,  不像DEMO 4場景只能水平面平移傳送 它可以傳送高低不同的地面,而且還可以模擬走上下樓梯的位移感

 

上圖中紅框中是擴展的功能參數

 

Play space falling 是否能下落

Play space fall restriction 下落條件, 規定哪個手柄位於當前平面內,就不會下落

 

Use gravity 是否自由落體加速度

Gravity Fall Height 超過多少高度差,纔開始自由落體

 

Blink Y threshold  高度落差超過多少值時,纔會模擬黑屏眨眼的效果

Floor Height Tolerance  找過這個數值時,纔會有上升和下降的位移

 

DEMO 008_Controller_UsingAGrabbedObject

和第6個場景原理類似,都是繼承VRTK_InteractableObject 腳本,物品的使用功能拓展

 

 

DEMO 009_Controller_BezierPointer

拋物線傳送偵測

 

VRTK_Simple Pointer功能類似  ,不同的使用用拋物線來代替激光直線獲取傳送的位置


紅框內是額外的參數 設置拋物線的最長有效距離 拋物線 中的物體, 落地的光標物體設置等,沒有什麼額外特別的東西

 

 

DEMO 010_CameraRig_TerrainTeleporting

地形傳送

 

此例子沒有演示新的功能,只是展示了可以在地形上傳送

DEMO 011_Camera_HeadSetCollisionFading

頭部碰撞到物品後黑屏眨眼效果, 提示玩家已經和遊戲中物體相接觸,讓其返回到正常的區域

 

附加在Camera(eye) 


DEMO 012_Controller_PointerWithAreaCollision

傳送的位置附近的物品如果和玩家可活動範圍碰撞器的相接觸,將影響傳送位置的最終位置,使其在合理的範圍內

 

開啓可玩區域碰撞體


DEMO 013 演示了多個物體抓取和使用的功能

 

DEMO 014 演示了抓取物品握住的位置


主要是這裏的參數設置,這些參數的意義之前已經有說明

 

 

DEMO 015_Controller_TouchpadAxisControl

 

演示手指在手柄觸摸板的觸摸位置 vector2 (x,y),來控制小車的移動方向, 手柄的扳機,控制小車跳起的動作

 

基本思路是 一個腳本監聽手柄的輸入事件, 將事件的相關值傳入到小車的控制器

 

監聽手柄按鍵


傳入到小車的控制運動的腳本


小車的運動部分函數


DEMO 016_Controller_HapticRumble

手柄震動

 

當藍色盒子上的劍和紅色盒子撞擊時,觸發手柄震動


基本思路是劍的物體碰撞器偵測到碰撞時,獲取手柄的運動速度,來決定震動的強度

 

如下圖 controllerActionControllerEvents對應的手柄身這兩個腳本


關鍵的震動方法是  VRTK.ControllerAction.TriggerHapticPulse ( 震動強度, 震動持續時間,震動間隔時間)

 

 

DEMO  017_CameraRig_TouchpadWalking

使用觸摸板來控制人物行走,以及在低矮的洞穴中蹲走時碰到頭頂的碰撞體,返回到能正常直立站立的位置

 

附加在此物體上



VRTK_PlayerPresence 讓人物有碰撞體, 且頭部上方有碰撞體時,如果不蹲着走,就會強制返回可以正常站立的位置

 

HeadSet Y position 頭部碰撞體離頭頂向下的偏移值, 這樣可以通過更矮的擋板

 

Ignore Grabbed Collisions  忽略交互物體的碰撞效果,建議勾上

Reset Position On Collision 在低矮的洞穴中蹲走時碰到頭頂的碰撞體,返回到能正常直立站立的位置

Falling physics only 如果打鉤,則可以自由落體下降

 

VRTK_TouchpadWalking

通過觸摸板的觸摸位置來定位移動方向

 

參數 leftController ,rightController如果勾選則可以控制移動

Max Walk Speed 最大行走速度 如果觸摸位置離中心位置越近,移動速度越慢

 

Deceleration  行走結束時的減速效果,防止噁心

MoveOnButtonPress  按下哪個按鍵時才能觸發移動(前提觸摸板也要輸入)

Device For Direction  移動的方向 以哪個設備爲基準     頭顯朝向,還是左右手柄的正方向

 

 

DEMO  018_顯示當前幀數

 

把這個prefab 拖到場景中就可以顯示當前幀數


DEMO 019_Controller_InteractingWithPointer

用手柄激光和物體交互

 

VRTK_interactionObject pointer activates use 打鉤後,就可以用激光和物體交互,如果HolonToUse 沒有勾選

,那麼激光落在物體上,就直接使用該物體,

 

如果  HolonToUse勾選了,那就需要激活指在物體上,同時按下扳機按鍵,才使用物體

DEMO 020_CameraRig_MeshTeleporting

在各種形狀的網格上傳送



激活指針傳送和拋物線在複雜網格模型上的傳送效果,沒有新的功能演示

 

 

 

DEMO 021_Controller_GrabbingObjectsWithJoints

物體不同的交互方式

 

打開寶箱


盒子的上半部分添加轉軸組件


設置轉軸的轉動軸向,位置,就可以像真實打開箱子一樣.

 

箱子的把手需要添加以下腳本


VRTK_Interactable Object 是必須要添加的腳本,它保證可以被手柄抓取  rigidbodyfiexed joint是用來連接上半部分的盒子,固定把手的位置


有一定活動區間關節物體

使用character joint 來確定上下關節的連接關係(每個關節也要添加rigidbody 組件)


其關節上的VRTK_InteractableObject Grab Attach Mechanic 要設置成spring_joint


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章