VRTK這個工具包提供了許多unity引擎中VR常用的功能,諸如(但不局限于):
用常用別名封裝的控制器按鈕事件
控制器世界光標(biāo)指針(eg.鐳射光標(biāo)steamVR_LaserPointer)
玩家傳送機(jī)制
用控制器抓取/握住游戲?qū)ο?/p>
用控制器和游戲?qū)ο蠼换?/p>
把游戲?qū)ο筠D(zhuǎn)化為可交互的UI元素
VRTK工具包項(xiàng)目拆分:
預(yù)設(shè)、腳本、案例
001-CameraRig_VR_PlayArea
展示[CameraRig]預(yù)設(shè)用法的簡單場景,實(shí)際上就是對VR_PlayArea的簡單設(shè)置。
002-Controller_Eventsduiying
還是001的場景,不同的是它控制器的事件進(jìn)行了封裝,便于在使用時(shí)進(jìn)行調(diào)用,同時(shí)還在該事件觸發(fā)時(shí)打印到控制臺窗口。一旦觸發(fā)對應(yīng)的控制器事件就會在Console窗口顯示。
腳本VRTK_ControllerEvents:(為我們提供控制器事件,即發(fā)出對應(yīng)的事件)負(fù)責(zé)處理游戲控制器發(fā)出的事件,所以綁定在每一個控制器對象上,這樣才能實(shí)時(shí)進(jìn)行手柄按鈕事件的監(jiān)聽(系統(tǒng)按鈕除外:因?yàn)樗菍iT為Steam平臺菜單預(yù)留的按鈕,無法被重寫)。
當(dāng)一個控制器按鈕被按下的時(shí)候,腳本會發(fā)送一個事件來表明這個按鈕已經(jīng)被按下了,這樣做的好處是允許其他腳本在無須實(shí)現(xiàn)任何控制器邏輯的情況下就能監(jiān)聽這個事件,這就是所謂的解耦。
Trigger_Hairline:扳機(jī)微扣
Trigger_Touch:扳機(jī)觸摸
Trigger_Press:扳機(jī)按下
Trigger_Click:扳機(jī)單擊
Grip:手柄按鈕
Touchpad_Touch:觸摸板觸摸
Touchpad_Press:觸摸板按下
Application_Menu:應(yīng)用菜單
Pointer Toggle Button:用來開關(guān)鐳射光標(biāo)的按鈕,默認(rèn)觸摸板按下
Pointer Set Button:用來設(shè)置目的地標(biāo)志的按鈕,默認(rèn)觸摸板按下
Grab Toggle Button:用來抓取游戲?qū)ο蟮陌粹o,默認(rèn)為手柄按鈕
Use Toggle Button:設(shè)置使用游戲?qū)ο蟀粹o,默認(rèn)為扳機(jī)單擊。
UI Click Button:用來點(diǎn)擊UI元素按鈕,默認(rèn)為扳機(jī)單擊。
Menu Toggle Button:用來調(diào)出游戲菜單的按鈕,默認(rèn)為應(yīng)用菜單
Axis Fidelity:軸發(fā)生改變時(shí)的保真值,默認(rèn)為1 。任何大于2的數(shù)值將有可能給出過于敏感的結(jié)果
003-Controller_SimplePointer
VRTK_SimplePointer:繼承自VRTK_WorldPointer,又接著繼承VRTK_DestinationMarker,繼承MonoBehaviour。
在按下觸摸板的時(shí)候從控制器上發(fā)射一條鐳射光線,在碰撞到其他對象的時(shí)候會有一個光標(biāo)指針,這個光標(biāo)事件同樣會打印到控制臺窗口。()從控制器前端發(fā)射一條射線,射線指向的游戲?qū)ο缶褪俏覀冞x中的對象,然后用其他按鈕來觸發(fā)一些操作。
默認(rèn)扳機(jī)鍵開關(guān),要在VRTK_ControllerEvents里的pointer Toggle Button來改,因?yàn)檎麄€事件都是通過該腳本來觸發(fā)的,SimplePointer只是對事件進(jìn)行監(jiān)聽。
Enable Teleport:光標(biāo)指針獲取新的目的地時(shí)能否傳送過去。
抽象類:我們在寫某個功能的時(shí)候,為了讓這個功能可以很方便地重寫和擴(kuò)展,保持對象的一致性和方法的穩(wěn)定性,就有了抽象類。
抽象層如何派生具象類的?
指針的原理其實(shí)很簡單,標(biāo)記一個終點(diǎn),然后從原點(diǎn)發(fā)出一條射線,去獲取碰撞到的點(diǎn)。原點(diǎn)就是獲取當(dāng)前的位置,這個很簡單,所以指針的腳本主要都是在做終點(diǎn)標(biāo)記的事情,中途無非是渲染光線懂得過程,所以抽象類就是標(biāo)記重點(diǎn)VRTK_DestinationMarker.
004-CameraRig_VR_BasicTeleport
在003的基礎(chǔ)上新增了簡單版本的傳送功能。
VRTK_Basic Teleport:按下觸摸板發(fā)射鐳射光線,松開觸摸板時(shí)就會傳送到光標(biāo)所在的位置。
梳理一下流程:監(jiān)聽控制器事件——指針射線——重點(diǎn)標(biāo)記——驗(yàn)證是否為有效傳送點(diǎn)+傳送(就是把CameraRig的位置設(shè)置為目標(biāo)傳送點(diǎn)的位置)
005-Controller_BasicObjectGrabbing
控制器觸摸場景中物體時(shí),物體高亮,扣動扳機(jī)即可抓起該物體,同時(shí)你可以做一個扔出去的動作,可以給該物體一個加速度,再松開扳機(jī),即可把對象扔出去。
互動對象上再添加VRTK_Interactable腳本組件。
抓取邏輯:1,控制釋放事件后立即執(zhí)行器上的四個腳本組件
VRTK_Controller Events:(為我們提供控制器事件,即發(fā)出對應(yīng)的事件)
VRTK_Controller Actions:控制器動作
VRTK_Interact Touch:觸摸,觸摸時(shí)可以配置是否隱藏控制器以及全局高亮顏色
VRTK_Interact Grab:抓取
?2,對控制器按鈕事件進(jìn)行監(jiān)聽,監(jiān)聽到抓取和釋放
006-Controller_UsingADoor
實(shí)現(xiàn)開關(guān)門功能
在抓取的四個腳本添加之后,又添加了VRTK_Interact Use(按下控制器上默認(rèn)的扳機(jī)鍵來使用一個對象,釋放該按鈕停止使用該對象。).
在使用VRTK_Interact Use的前提是:建立在觸摸和抓取之上,需要控制器事件和動作的支持。
在與可交互對象產(chǎn)生交互時(shí),對象上往往需要一個腳本組件,該組件既可以使VRTK_Interacable Onject,也可以是繼承于該類的子類。Openable_Door就是VRTK_Interacable Onject的子類。
也可以開窗戶,開柜子,開閘等,只需要調(diào)整詳細(xì)的角度即可。
007-CameraRig_HeightAdjustTeleport
展示了適應(yīng)高度的傳送機(jī)制,再有高低梯度的場景中,玩家應(yīng)該擁有攀爬的能力,和現(xiàn)實(shí)中一樣。同時(shí),當(dāng)腳下踏空的時(shí)候,也應(yīng)該會掉落到低處,知道觸地在實(shí)體上為止。
核心腳本:VRTK_Height Adjust Teleport
繼承自VRTK_Basic Teleport,允許基于傳送點(diǎn)事都在其他對象上來變更[CameraRig]的Y位置,和VRTK_Basic Teleport一樣,腳本組件必須掛載在[CameraRig]上,且必須要World Pointer(世界指針)即可。
008-Controller_UsingAGrabbedObject
展示了抓取之后再使用對象的功能
場景中極簡易的槍按下兩個手柄按鈕抓取后,再按扳機(jī)開火。
Gun是從VRTK_InteractableObject派生出的腳本組件是比較簡單的可交互對象的應(yīng)用。
上圖Whirlygig也是繼承自VRTK_InteractableObject,使盒子上的膠囊體旋轉(zhuǎn)起來。
009-Controller_BezierPointer
003+007場景。來建立在適應(yīng)高度傳送的基礎(chǔ)上,在光標(biāo)指針上做了優(yōu)化,使鐳射光線呈貝賽爾曲線狀,類似于拋物線。優(yōu)點(diǎn):使玩家可以傳送到實(shí)現(xiàn)不可及或者有障礙的地方,例如圍墻和高臺。
這里貝塞爾光標(biāo)指針取代簡單光標(biāo)指針,使傳送的目標(biāo)點(diǎn)更靈活。
VRTK_BasicPointer 繼承自VRTK_WorldPointer.
貝塞爾指針會從控制器的末端發(fā)射一條曲線到任何高度的地表,這比SimpleLaserPointer有用的多,因?yàn)殍D射指針會被障礙物擋住,而貝塞爾指針的光線是彎曲的,可以跨越障礙物標(biāo)記到后面的地面,或者穿越高低不平的地形。
010-CameraRig_TerrainTeleporting
在007的基礎(chǔ)上加了地形Terrain,也可以傳送。
011_CameraRig_HeadSetCollisionFading
防穿墻功能,穿墻就變黑(防患于未然)
就像客戶進(jìn)入樣板間看房子,由于VR空間中用戶的自由度是極高的,難免會把頭伸到墻里。在游戲里就是一個很明顯的BUG,比如在FPS里玩家可以通過穿墻的漏洞來獲取敵人的位置,然而NPC敵人的子彈并不能穿墻,玩家可以在獲取視野后快速消滅敵人。
核心腳本VRTK_Headset Collision Fade:
探測什么時(shí)候用戶的VR頭盔與其他游戲?qū)ο蟀l(fā)生碰撞,并且在探測到碰撞的時(shí)候淡入屏幕到一個單色。這樣是為了處理那些把頭部放進(jìn)游戲?qū)ο螅ɡ鐗w、門、柜子)中進(jìn)行透視的情況,但我們并不希望玩家發(fā)現(xiàn)這樣的穿幫。
頭盔與游戲?qū)ο蟀l(fā)生碰撞時(shí)發(fā)出HeadsetCollisionDetect事件,表示探測到頭盔碰撞;停止碰撞是,發(fā)出HeadsetCollisionEnd事件。
012_Controller_PointerWithAreaCollision
009貝塞爾光標(biāo)的優(yōu)化版。當(dāng)射線遇到障礙物時(shí)無法進(jìn)行傳送。
與當(dāng)這個玩家區(qū)域與障礙物碰撞時(shí)會從綠色變成紅色,或者當(dāng)傳送區(qū)域是玩家無法站立的地方也會變紅,變紅則無法傳送。
實(shí)際上是游戲的一種保護(hù)機(jī)制,避免玩家傳送到某些區(qū)域。
013_UsingAndGrabbingMultipleObjects
006開門+008簡單手槍 的優(yōu)化版
014_Controller_SnappingObjectsOnGrab
展示不同的抓取對其方式。
光劍和寶劍和兩把綠色的槍:利用對齊把手。所謂的對齊把手是指可交互對象的一個子類,往往是一個空物體對象。但是這個把手決定了抓取時(shí)可交互對象的朝向,也就是說其位置和旋轉(zhuǎn)會根據(jù)把手來匹配。
紅色的槍:基本對齊,不精確且沒有把手,抓取的時(shí)候會取其位置的中心點(diǎn)。
紅和綠色槍:精確對齊,Precision Snap與控制器觸摸對象時(shí)點(diǎn)掛鉤,抓取的位置就是觸摸的地方。
015_Controller_TouchpadAxisControl
用Pad操作小車的前進(jìn)和后退。按下扳機(jī)小車跳躍,按下的越多小車就會跳的越高。
核心腳本:RC_Car_Controller
可以設(shè)計(jì)賽道,就像動畫片《四驅(qū)賽車》,解鎖關(guān)卡和劇情,利用金幣購買賽車配件等。
016_Controller_HapticRumble
寶劍+震動
展示可粉碎的盒子和一把大寶劍。拾取寶劍揮舞攻擊盒子,控制器會根據(jù)寶劍攻擊力度適當(dāng)震動,攻擊力度足夠大的時(shí)候可以擊碎這些盒子。
繼承自Interactable_Object(可交互對象)
當(dāng)檢測到碰撞時(shí)看力度夠大嗎,力量達(dá)到破碎臨界值時(shí)就爆開。
當(dāng)藍(lán)色盒子上的劍和紅色盒子撞擊時(shí),觸發(fā)手柄震動

基本思路是劍的物體碰撞器偵測到碰撞時(shí),獲取手柄的運(yùn)動速度,來決定震動的強(qiáng)度。?
如下圖,controllerAction和ControllerEvents對應(yīng)的手柄身這兩個腳本。?

關(guān)鍵的震動方法是:有VRTK.ControllerAction.TriggerHapticPulse?( 震動強(qiáng)度, 震動持續(xù)時(shí)間,震動間隔時(shí)間)。
017_CameraRig_TouchpadWalking
011觸摸板在場景中移動
觸摸板移動功能:VRTK_Touchpad Walking,在玩家位置添加剛體和碰撞體,以免玩家穿墻或者穿過其他帶碰撞的游戲物體。
018_CameraRig_FramesPerSecondCouter
幀率幕布預(yù)設(shè):每秒刷新多少幀,在平常的PC游戲是60,手機(jī)游戲減半。VR理想幀率:120,目前能夠達(dá)到:90.
019_Controller_InteractingWithPointer
通過指針光線來使用可交互對象:按下觸摸板激活光線,瞄準(zhǔn)可交互對象,再次按下扳機(jī)鍵完成交互。
020_CameraRig_MeshTeleporting
007適用于網(wǎng)格碰撞體
21
如何抓取,使用帶關(guān)節(jié)的可交互對象
固定關(guān)節(jié)對象:立方體
彈力關(guān)節(jié):拉取抽屜
旋轉(zhuǎn)追蹤機(jī)制:開門關(guān)門
角色關(guān)節(jié):對于操作那些不同形狀和多節(jié)點(diǎn)的對象更方便,可以通過拉取相關(guān)的部分來改變形狀。
22
自定義貝塞爾曲線指針:自定義軌跡和光標(biāo)
23
射箭游戲:可交互對象的擴(kuò)展
24
007,通過腳本組件的類名ExcludeTeleport或者Tag名把一些特定的對象排除在傳送地點(diǎn)之外。如果對象上有同名的腳本組件或標(biāo)簽,就作為傳送的地點(diǎn)。
25
送展示幾乎所有已知互動控制的設(shè)置以及如何對發(fā)出的事件進(jìn)行響應(yīng)。
VRTK_Simulator:WSAD控制移動
26
制讓玩家在游戲開始的時(shí)候就抓取一個對象在手里,并且防止玩家丟棄該對象。
默認(rèn)已抓取,強(qiáng)制觸摸和企圖抓取方法來實(shí)現(xiàn)自動抓取的。
27
傳送的觸發(fā)方法:觸摸并使用地圖上的對象把玩家傳送到指定的地點(diǎn),類似水晶球,而且水晶球里面還有一個場景預(yù)覽。
28
按下觸摸鍵,玩家區(qū)域與自己一起移動到目的地。
VRTK_RoomExtender
29
展示控制器和對象的提示信息展示方式。很多游戲中都會有一些提示信息,控制器上的往往是一些操作提示,而游戲?qū)ο笊贤且恍┯螒蚓€索。
運(yùn)行時(shí),控制器和游戲?qū)ο笊隙紩@示相應(yīng)的提示信息,從而幫助玩家學(xué)會操作。
VRTK_Controller Tooltips
VRTK_Object Tooltips
30
展示控制器觸摸板上的環(huán)形菜單,游戲設(shè)置:暫停、繼續(xù)、保存(懸浮一個曲面窗口、出現(xiàn)在玩家手臂上、在控制器的任何位置)
031
把貝塞爾曲線指針放在頭盔上,激活光線、和可交互對象的互動都是通過控制器來完成的,從頭盔發(fā)射光線有凝視某個物體的感覺。
032
和在僵尸游戲中配置Ak有相似之處
033
傳送到unity自帶的導(dǎo)航組件navigation
034
在右控制器上的VRTK_UIPointer腳本組件使用一道簡單的指針射線和UGUI產(chǎn)生交互,
在左控制器上控制的是頭盔上發(fā)出的簡單指針,通過凝視再與UGUI產(chǎn)生交互。
035
修改透明度和高亮
036
如何自定義混合指針
左控制器是簡單指針
右控制器是貝塞爾曲線指針
037
可以攀爬