VRTK是擴展SteamVR的一個Unity3D插件,主要是爲了方便開發者快速地開發出vr產品,其內置了相當多的當下比較成熟的VR界面下的交互、操作等解決方案,目前最新版本爲3.2.0,支持了更多VR設備,功能也更加強大。然而我昨天才知道並下載。。因此寫下此文章來供自己參考,當然也歡迎討論新插件的黑科技。。
另外steamVR也更新到了1.2.1,其中也有一個Demo場景,也實現了相當多的交互操作,雖然目前版本功能並沒有VRTK提供的功能強大,但是使用起來感覺非常流暢,其中的射箭Demo完全就跟TheLab中的射箭操作感一模一樣。。相比之下vrtk那個寒酸的射箭場景就....如果steamVR在下個版本提供更多Demo場景和更強大的功能,我想會搶走相當多的steamVR開發者拋棄vrtk了吧。。。哈哈
因爲我是從老版本轉過來的,因此可能很多地方會和老版本作對比。還有一些Demo場景未寫,原因是跟老版本差別不大因此不再浪費時間解釋。望諒解哈。
開始:
測試發現VRTK_TrackObjectGrabAttach跟蹤抓取在碰撞很多的地方比關節抓取效果要好一些,關節抓取控制器在碰撞體內時被抓取得物體會亂飛,但是跟蹤抓取試了一下似乎沒有這個問題。
VRTK_ObjectAppearance靜態類包含一些操作gameobject的功能,例如將其高亮,改變透明度等(高亮需要這個gameobject掛了繼承
VRTK_BaseHighlighter的組件,例如VRTK_OutlineObjectCopyHighlighter,還需要先調用該組件的Initialise初始化方法之後才能
用VRTK_ObjectAppearance高亮)。
008_Controller_UsingAGrabbedObject這個例子又從VRTK_InteractableObject腳本上分離出來了一個VRTK_InteractControllerAppearance腳本。該腳本效果同舊版本的抓取/觸摸/使用時隱藏控制器。以及場景中還有一些比老版本更多的其他可交互物體。
011_Camera_HeadSetCollisionFading 這個例子中[VRTK_Scripts]下掛的腳本VRTK_HeadsetCollision有一個對象:headset,它在
運行時動態尋找當前頭盔並變爲其子物體。新版本中很多掛在[VRTK_Scripts]下的腳本都是以此方法尋找到正確的當前VR設備,因此開發者不需要考慮我用htcVive時和Oculus時腳本需要做出什麼改變,vrtk會自動幫你做這塊的工作。
012_Controller_PointerWithAreaCollision 利用VRTK_BodyPhysics和VRTK_HeadsetCollision給角色全身添加了碰撞體。另外還
在手柄上分離了VRTK_PlayAreaCursor腳本來顯示移動時遊玩範圍指示,另外和舊版本一樣勾選了此腳本上的
HandlePlayAreaCursorCollisions來限制玩家不能移動到遊玩範圍碰撞到其他碰撞體的位置。
017_CameraRig_TouchpadWalking 老版本直接在camerarig上添加VRTK_TouchpadWalking腳本就行了。新版本需要在移動的手柄
上加VRTK_TouchpadControl腳本來控制移動。
021_Controller_GrabbingObjectsWithJoints 這個場景新增加了些東西,例如一個藍色盒子,主要用來演示
VRTK_SpringJointGrabAttach這個腳本,物體被抓取時創建一個關節,感覺就像抓到一個很重的東西。
還有一個滅火器,管子是用彈簧關節連接的(雖然效果還是很假...),然後管頭也可以抓取,還可以設置BreakDistance,這個值是
自定義的,超出範圍後手動調用交互物體類的ForceStopInteracting方法就可以強制放下對象(因爲管頭用的是追蹤連接,不能像
關節連接一樣設置breakForce,因此只能這樣去判斷)。
然後還有一把手槍,其中開槍後會打開手槍腳本並移動手槍頂的位置,手槍頂的關節會將其強行拉回來,感覺就像是開槍產生的動畫
,另外槍上還有一個保險栓,可以打開或關閉使槍不能射擊(保險栓碰撞很小,之前舊版本這種小碰撞體很難觸摸到,但是新版本卻
很容易,可能vrtk新版本有優化吧)。
023_Controller_ChildOfControllerOnGrab 射箭例子在[VRTK_Scripts]中出現了新腳本:HeadsetFollower對象上掛的
VRTK_SDKObjectAlias 掛了這個腳本的物體會在運行時自動變爲所選SdkObject的子物體(只看到了頭和camerarig的子物
體的選項,可以自己擴展左右手),然後Headset對象掛了一個VRTK_TransformFollow腳本,GameObjectToFollow就是
HeadsetFollower對象,GameObjectToChange則是自己。這樣最終效果就是HeadsetFollower對象和頭部位置一致,然後
Headset也與HeadsetFollower對象位置一致,都是頭部子物體,取箭就可以在頭部取。
024_CameraRig_ExcludeTeleportLocations 例子展示有些地區不能移動,利用了VRTK_PolicyList。
025_Controls_Overview 這個場景使用vrtk自帶腳本實現了vr模式下的一些物理交互,值得一提的是有一個旋轉按鈕在老版本中是
沒有最大最小值限制的,就像煤氣竈開關一樣,但是卻可以無限旋轉。。所以新版本新加了更多交互例子,也爲旋轉按鈕增加了限制。
027_CameraRig_TeleportByModelVillage 這個例子運用了ModelVillage_TeleportLocation腳本實現靠近三個方塊中的一個後按下
扳機鍵後傳送到某處。舊版本也有這個例子但是當時沒看。。注意場景這個桌子也是利用023demo的腳本讓桌子變成camerarig的子
物體。
028_CameraRig_RoomExtender 這個例子使用了VRTK_RoomExtender腳本來擴展遊玩範圍,但是無論老版本還是新版本效果都不太好。。
029_Controller_Tooltips 這個例子是各種提示..其實沒啥好說的,看看demo就都懂了。唯一跟老版本的一點區別就是加了一個
VRTK_HeadsetControllerAware腳本用來控制手柄距離多近之後顯示提示。
030_Controls_RadialTouchpadMenu 例子是手柄選擇的ui,還有靠近物體時顯示一個可選擇選項的ui。沒有細看,以後可能會用到
,所以mark一下。。
031_CameraRig_HeadsetGazePointer 這個例子一個是靠頭盔來移動,一個是靠頭頂上一個黃球對象控制移動。可能沒什麼用,但
還挺有意思,以後說不定會用到,再mark一下!
032_Controller_CustomControllerModel 改變控制器模型的例子,這個真沒什麼好說的了。
034_Controls_InteractingWithUnityUI 這個例子最大的改變就是有了一個可拖動的UI,主要是用了VRTK_UIDraggableItem這
個腳本,配合VRTK_UIDropZone腳本實現物體可拖入方框。注意VRTK_UIDraggableItem要勾選restrictToDropZone代表
可拖入掛了VRTK_UIDropZone的框框中去,另外一個restrictToOriginalCanvas表示物體是否可拖入canvas畫布中。另
外這個拖動完美兼容ugui的EventTrigger腳本,具體使用方法可以參考例子。
035_Controller_OpacityAndHighlighting 這個例子控制器按下任何按鍵都會高亮該按鍵並且提示ui,可以參考腳本:
VRTK_ControllerAppearance_Example。手柄高亮仍然依靠VRTK_OutlineObjectCopyHighlighter腳本控制。另外這裏有個功能:
VRTK_ObjectAppearance.SetOpacity(GameObject model, float alpha, float transitionDuration = 0f)
方法可以設置一個model的透明度。
037_CameraRig_ClimbingFalling 這個例子每個物體都掛了VRTK_ClimbableGrabAttach腳本使得可以用手柄攀爬(可交互物體使用
該腳本後不能再給可交互物體增加其他抓取方式)。另外場景中還有一個繩索,抓住之後會位移這個繩索實現滑動效果。
040_Controls_PanelMenu 這個例子使用了PanelMunu這個預設體放爲可交互對象的子物體,按下pad對應按鍵後會彈出對應ui,一
些可交互ui需要調用VRTK_PanelMenuItemController對應的事件方法,具體可以參考此demo。
041_Controller_ObjectSnappingToDropZones 這個例子利用了SnapDropZone這個預設體實現物體放到指定位置拼裝的功能,左邊
簡單物體的拼裝效果還不錯,但是右邊人體的拼裝體驗很差,稍不注意胳膊腿就飛了。。即使關節的breakForce設置了infinity但
是還是無效。。回頭如果這個功能運用到項目中的話還存在這個問題那這個功能就很雞肋了。。
042_CameraRig_MoveInPlace 之前demo有一個是用pad鍵控制移動,是一個很雞肋的功能,因爲會很暈。vrtk似乎注意到了這個問
題,所以這個demo更改了移動方式,利用VRTK_MoveInPlace腳本實現控制器按下某個鍵之後不停地做Y軸移動纔開始移動,這樣會
使玩家增加一點沉浸感,雖然暫時還是覺得很雞肋啊!
043_Controller_SecondaryControllerActions 這個場景共有兩個有用的腳本,一個是放着長槍和柺杖上的
VRTK_ControlDirectionGrabAction腳本,它的用處是使這個可交互物體變爲可雙手抓取,一個手抓取,另一個手控制旋轉。想象
一下手持shotGun的時候就需要雙手,一個細節是掛了此腳本的可交互物體不能用關節控制器,如果勾選PrecisionGrab(按當前控
制器位置抓取)後另一隻手控制的旋轉就不會復位,如果使用了SnapHandle那麼另一隻手鬆開後旋轉會復位。然後另一個腳本是
VRTK_AxisScaleGrabAction,它可以讓另一隻手改變物體縮放。
044_CameraRig_RestrictedTeleportZones 最後一個例子主要展示了固定目標點位移。主要是依靠DestinationPoint這個預設體,
上面掛的腳本VRTK_DestinationPoint很明瞭了:開關傳送、默認樣式,hover的樣式以及關閉時的樣式等等的功能。目前我在開
發的一個項目就是需要這種定點傳送,奈何我還用着老版本的vrtk..都是淚啊。。
總結:
花了大半天的時間總算大致看完了新版vrtk的demo。其實怎麼說呢,我一直認爲這些插件一定要把這些demo仔細看一遍,這樣在
開發時心裏纔能有一些底。vrtk的確很強大,但它並不是百科全書。遇到問題時纔來匆匆忙忙一個一個查找demo費時又費力,而
且也不一定有你需要的效果。而如果你完整的看過vrtk的所有demo,遇到問題時可以先在腦子過一遍vrtk是否已經有了解決方案?
如果沒有是否有類似的效果,能否改改就用呢?這樣在美術或者策劃帶着天馬行空的想法來要求你實現時你才能更得心應手地預
估他們的想法實現難度。不過雖然這麼說估計我馬上也要轉行做別的了,vr實現的效果畢竟還是有些簡單,而且我目前也在我司
看不到任何前途。。希望以後vrtk和steamvr更加強大,能夠推出更強大的插件吧。。也希望vr不要就此沒落啦...