VRTK案例001~037

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)的手柄身這兩個腳本。?


Sword.cs

關(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

可以攀爬

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容