VRTK 2.2.1版本所有Demo詳解

昨天沒事進了vrtk官網,才發現居然已經出到了3.2.0,趕緊下下來看了看。大版本更新變化實在太大了,也突然感覺到了使用插件的壞處,就是要一直追着別人的步伐。。但是怎麼說呢,更新畢竟是好事,vrtk在新版本中明顯感覺功能強大了不少,因此最近還會抽時間寫一篇新版本的vrtk的Demo詳解,以下是我之前學習老版本vrtk時總結的一些小小的東西,因爲是大半年前總結的,所以有些東西可能理解的並不透徹,但是在之後我使用vrtk作爲參考還是提供了很大幫助的,因爲最近快離職了所以趕緊把這些東西傳到網上。。另外這個最初是寫給自己看的,所以很多地方可能不太好懂,歡迎一起討論。。

有些demo沒寫,可能是因爲那幾個demo參考價值不大,或者是內容跟之前寫過的demo場景功能相似,所以略過了。


啓蒙:
http://www.chinaar.com/unity/1739.html  SteamVR Unity工具包(一):概覽和控制器事件
http://www.chinaar.com/unity/1740.html  SteamVR Unity工具包(二):激光和移動
http://www.chinaar.com/unity/1741.html  SteamVR Unity工具包(三):控制器交互


總結:
  控制器行爲腳本(VRTK_ControllerActions,綁在左右手控制器上)提供了處理常見控制器行爲的幫助方法。如下可用公共方法: IsControllerVisible(): 如果控制器模型是可見的返回真,否則返回假。 ToggleControllerModel(bool on):根據所給布爾值狀態設置控制器模型的可見性。如果傳入true,控制器模型就被顯示出來,如果傳入false,控制器就被隱藏了。 
  TriggerHapticPulse(int duration, ushort strength):啓動控制器開始震動,根據給定的持續計時(第一個參數)和震動強度(第二個strength參數)。最大強度可以是3999,超過就限制爲3999(參考例子016)。
  ToggleHighlightTrigger(bool state, Color? highlight = null, float duration = 0f)第一個參數表示高亮狀態,true開始高亮,false取消高亮。第二個參數是顏色。第三個參數是漸變到第二個參數的時間
  防止hingle關節碰撞擠壓亂跑:繼承該物體的interactObject然後在oncollisionenter、stay和exit中分別打開和關閉物體的剛體動力學。例如只有在可以拉動這個物體的手進入碰撞時不變剛體屬性其他物體進入碰撞時打開剛體動力學使其不受影響。另外關節綁定隱藏和左右手控制有些坑可以參考SHAQ的物體抓取


demo:
  003_Controller_SimplePointer例子演示simpointer事件輸出,按下某個按鍵出現射線可在vrtk_controllerEvents中的pointerToggleButton修改


  004_CameraRig_BasicTeleport例子相對003在頭盔額外綁定了vrtk_BasicTeleport基礎傳送器作位移,其中IgnoreTarget...標籤可以修改某些物體無法移動(射線射中時仍顯示miss,牆可以加這個)


  006_Controller_UsingADoor例子可以控制控制器開門(雙向開門)。和013相似,門上腳本繼承了VRTK_InteractableObject勾選isUsable然後重寫StartUsing方法。具體內容爲觸發startusing時調用SetDoorRotation判斷當前手柄位置在門前還是門後(門要選擇是否勾選rotated字段,如果勾選則判斷X軸,未勾選則判斷Z軸)隨後調用SetRotation方法將openRotation變量修改。主要改Y軸,其中doorOpenAngle代表打開的度數,剩下兩個字段判斷到底正開還是反開,最後update中將門的旋轉過度到openRotation。原理上應該是這樣,只是代碼中sideFlip和side不懂爲什麼要做的這麼複雜。


  007_CameraRig_HeightAdjustTeleport例子使用了VRTK_HeightAdjustTeleport高度可變傳送器,基本和基礎傳送器一樣,只是暫時不知道如何設置移動的高度


  009_Controller_BezierPointer例子是使用貝賽爾曲線移動,同樣可以根據Pointer Toggle button修改按鍵觸發方式。其中ActivateDelay表示傳送間隔防止頻繁傳送。


  011_Camera_HeadSetCollisionFading展示了利用VRTK_HeadsetCollisionFade腳本(綁在camera(eye)上,5.3以前版本綁在head上)限制玩家無法將頭盔伸進碰撞體裏面,否則頭盔會淡入純色並禁用傳送。注意HeadsetCollisionEventHandler腳本中的HeadsetCollisionEventHandler委託,該委託第二個參數是本類中的一個struct結構體,在調用的時候傳遞結構體的兩個參數進來(碰撞到的物體和頭盔camera),很巧妙的做法。使用時可以給HeadsetCollisionDetect事件增加事件或修改VRTK_HeadsetCollisionFade的事件邏輯以檢測或提示物體是否可以碰


  012_Controller_PointerWithAreaCollision與009相似是用貝塞爾移動,但是勾選了Handle Play Area Cursor Collisions如果勾選則表示遊玩區域只要有碰撞就無法移動,需要一併勾選ShowPlayAreaCursor(顯示遊玩區域)才能生效。


  013_Controller_UsingAndGrabbingMultipleObjects例子中物體可以拿在手上使用,原理上是繼承了VRTK_InteractableObject方法勾選isUsable並且在子類中重寫StartUsing和StopUsing(非常好的例子,例如遙控器這種物體拿在手上直接繼承重寫方法就好了,很舒服。)


  014_Controller_SnappingObjectsOnGrab例子演示物體被抓取時位置綁定(例如劍拿在手上手中握着的總是劍柄)


  015_Controller_TouchpadAxisControl例子演示了利用控制器pad控制一輛汽車移動,控制器上綁着RC_Car_Controller腳本用來做各種事件觸發,觸發事件全部調用汽車上綁定的RC_Car腳本,這個腳本就用來控制汽車的移動,旋轉。汽車移動旋轉跳躍統一隻用剛體控制,例如MovePosition,MoveRotation和add一個向上的force模擬跳躍。


  016_Controller_HapticRumble例子和026相似,用劍砍箱子。主要展示了劍上面sword腳本中OnCollisionEnter方法調用了TriggerHapticPulse根據揮砍的力度進行手柄震動。另外collisionForce字段在CollisionForce方法中被箱子上掛的腳本Breakable_Cube獲取,用來判斷大於一定力度會砍到箱子時會在箱子中附加一個爆炸力炸散箱子(原本六個面什麼都沒有,父類有剛體和box碰撞體,當觸發爆炸時會將六個面的parent設爲空,並且附加剛體到六個面隨後對每個面附加AddExplosionForce爆炸力,具體參考breakable_cube腳本中的ExplodeFace方法)。


  017_CameraRig_TouchpadWalking例子中展示了VRTK_PlayerPresence表示玩家碰撞體,其中 Ignore Grabbed Collisions勾選則表示不和抓取的物體碰撞。另外還有VRTK_TouchpadWalking表示pad控制移動,這個沒有什麼好說的。


  018_CameraRig_FramesPerSecondCounter展示了vr中顯示fps幀數,使用了FramesPerSecondCanvas這個UGUI預設體。


  019_Controller_InteractingWithPointer表示使用simplePointer觸發物體using,物體的類寫法仍然是繼承VRTK_InteractableObject並重寫startusing和stopusing方法(我還在父類發現了ongrab和ungrab的以及using的事件,可以靈活使用)。唯一不同的是使用時勾選了PointerActivatesUseAction,則pointer可以觸發到改對象的startuse事件(startuse勾選HodlButtonToUse則按住觸發startUsing,鬆開觸發stopUsing,不勾選按下則只觸發startUsing,再按下觸發stopUsing。另外修改useoverrideButton無法控制射線觸發方式,只可以更改普通觸發的控制器按鍵)。另外該例子上的左右控制器還綁了一個Controller_Menu腳本,可以參考寫法,大致是監聽VRTK_ControllerEvents的menu按下和彈起事件觸發實例化一個menuBox並顯示。menuBox上還掛着一個Menu_Container_Object_Colors腳本,也是繼承VRTK_InteractableObject並寫了一個切換顏色的方法,當上面三個顏色按鈕startUsing時調用該方法執行所有子類繼承VRTK_InteractableObject的方法裏切換顏色方法切換所有子類顏色(很巧妙)。最後在正方體和原型中的startusing時create物體出來。看似效果比較複雜,但實際上流程十分簡潔明瞭。(有一點疑問是在Menu_Color_Changer中startusing最後調用ResetMenuItems方法遍歷所有Menu_Color_Changer執行了stopusing,暫時不知道爲什麼要這樣結束,可能是怕兩次startusing間隔時間太短導致報錯做的措施)。


  021_Controller_GrabbingObjectsWithJoints例子中使用抓取配合關節綁定實現了開關門/開關盒子/轉動輪盤等效果。


  022_Controller_CustomBezierPointer是特殊外觀的貝塞爾曲線,特殊預設大致是播放粒子效果。


  023_Controller_ChildOfControllerOnGrab是一個射箭的demo,注意VRTK_ControllerEvents中的grabPressed字段可以判斷抓取鍵是否按下以及VRTK_DeviceFinder.GetControllerLeftHand()可以直接獲取到制定控制器或camera(不需要device的ID),其他代碼以後有時間細看。
  
  024_CameraRig_ExcludeTeleportLocations設置camera剔除部分物體無法移動。
  
  025_Controls_Overview 強化版關節綁定,使用另外腳本實現而不依靠關節,其中數值變化是ControlReactor腳本中調用另一個腳本的基類OnValueChanged註冊改變百分比方法。其他滑動和旋轉效果均繼承自VRTK_Control腳本,子類代碼應該是自己實現的。未細看所以可能有坑,慎用。


  026_Controller_ForceHoldObject例子演示自動抓取,左右控制器都綁定了VRTK_ObjectAutoGrab腳本,其中劍的抓取被設置爲不能放下並且抓取模式爲變成控制器子物體(即Child_of_Controller而不是fixed_Joint)。這樣只要重複開啓了VRTK_ObjectAutoGrab劍都會自動跑到控制器上來。




  030_Controls_RadialTouchpadMenu 控制器Menu上的UI,未細看


  034_Controls_InteractingWithUnityUI UGUI實例,未看


  038_CameraRig_DashTeleport Dash移動,會有一個人物移動過去的過渡動畫


  039_CameraRig_AdaptiveQuality FPS測試

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