1. 程式人生 > >SteamVR Unity工具包(VRTK)之鐳射和移動

SteamVR Unity工具包(VRTK)之鐳射和移動

簡單鐳射指標(VRTK_ SimplePointer)


 

簡單指標(Simple Pointer)指令碼從控制器尾部發出一個有色光束來模擬鐳射束。這在場景中指向物件很有用,它能判斷所指向的物件以及物件距控制器發出光束位置的距離。   鐳射束預設按下控制器的抓握鍵(Grip)來啟用。因為所偵聽的事件是AliasPointer別名事件,所以這個指標開關按鈕可以通過在 VRTK_ControllerEvents指令碼引數裡來改變 pointerToggleButton來選擇設定。   簡單指標指令碼(VRTK_ SimplePointer)新增到[CameraRig] 預製裡的控制器物件上,同時新增需要VRTK_ControllerEvents指令碼來監聽啟用和禁用光束的控制器按鈕事件。
  下面是可用指令碼引數:   · Enable Teleport(啟用傳送):如果勾選了,在目標設定事件中的teleport標誌位就設為true,所以傳送指令碼就知道是否要行動到新的目標。如果這個選項沒有勾選的話,控制器光束啟動但是不會觸發位移。   · Point Hit Color(指標碰撞顏色):當光束和一個有效目標碰撞的顏色。每個控制器可以有不同的顏色設定。   · Pointer Miss Color(指標無碰撞顏色):
當光束沒有命中有效目標時的顏色。每個控制器可以有不同的顏色設定。
  · Show Play Area Cursor(顯示遊玩區游標):如果這個啟動,遊玩區界限就會在光束指標的頂端顯示出來,顏色和當前指標顏色相同。   · Play Area Cursor Dimensions(遊玩去游標尺寸):決定遊玩區游標和碰撞的尺寸。如果值為零,Play Area Cursor 的尺寸將根據Play Area空間進行校正。   · Handle Play Area Cursor Collisions(處理遊玩區游標碰撞):
如果勾選,當遊玩區游標和其他物體發生碰撞時,指標顏色就會變成Pointer Miss Color的顏色且WorldPointerDestinationSet 事件將不會被觸發,這將防止傳送到遊玩區會發生碰撞的區域。
  · Beam Always On(光束總是開啟):如果這個勾選,光束指標總是可見,但是設定目標點事件仍然只會在所指定按鈕鬆開時發出。   · Pointer Thickness(指標光束厚度):光束長寬也可以在腳本里設定以及能夠開關顯示在光柱最後的球形光柱頂端(表示游標)。   · Pointer Length(指標光束長度):在停止前光束投射的距離。   · Show Pointer Tip(顯示指標頂端):切換是否游標顯示在光束指標的尾部。     簡單指標物件擴充套件自VRTK_WorldPointer 抽象類並因此發出相同的事件和有效資料。   VRTK_SimplePointer指令碼的例子可以在SteamVR_Unity_Toolkit/Examples/003_Controller_SimplePointer場景中看到並且事件用法和監聽的指令碼例子可以看SteamVR_Unity_Toolkit/Examples/Resources/Scripts/VRTK_ControllerPointerEvents_ListenerExample.cs指令碼。


貝塞爾曲線鐳射指標(VRTK_BezierPointer)
  貝塞爾指標從控制器末端發出一個曲線(由遊戲物件組構而成)到(任何高度的)地面上一點。這比簡單鐳射指標要有用的多,因為終點能夠彎曲到玩家看不見的物件頂部,所以就可以傳送到各種高度的物件上。   鐳射束預設按控制器上的抓握鍵Grip來啟用。事件偵聽AliasPointer別名事件,所以Pointer Toggle button可以通過在VRTK_ControllerEvents 指令碼中改變Pointer Toggle button來進行選擇設定。   貝塞爾指標指令碼被新增到[CameraRig]預製裡的控制器物件上,控制器物件同時需要新增VRTK_ControllerEvents指令碼用來監聽控制器按鈕開關光束的事件。   可用指令碼引數如下:   · Enable Teleport(啟用傳送):如果勾選了,在目標設定事件中的teleport標誌位就設為true,所以傳送指令碼就知道是否要行動到新的目標。如果這個選項沒有勾選的話,控制器光束啟動但是不會觸發位移。   · Point Hit Color(指標碰撞顏色):當光束和一個有效目標碰撞的顏色。每個控制器可以有不同的顏色設定。   · Pointer Miss Color(指標無碰撞顏色):當光束沒有命中有效目標時的顏色。每個控制器可以有不同的顏色設定。   · Show Play Area Cursor(顯示遊玩區游標):如果這個啟動,遊玩區界限就會在光束指標的頂端顯示出來,顏色和當前指標顏色相同。   · Play Area Cursor Dimensions(遊玩去游標尺寸):決定遊玩區游標和碰撞的尺寸。如果值為零,Play Area Cursor 的尺寸將根據Play Area空間進行校正。   · Handle Play Area Cursor Collisions(處理遊玩區游標碰撞):如果勾選,當遊玩區游標和其他物體發生碰撞時,指標顏色就會變成Pointer Miss Color的顏色且WorldPointerDestinationSet 事件將不會被觸發,這將防止傳送到遊玩區會發生碰撞的區域。   · Beam Always On(光束總是開啟):如果這個勾選,光束指標總是可見,但是設定目標點事件仍然只會在所指定按鈕鬆開時發出。   · Activate Delay(啟用間隔):能夠再次啟用指標光束的延遲時間秒數。用來防止持續傳送。   · Pointer Length(指標光束長度):在停止前光束投射的距離。   · Pointer Density(指標密度):貝塞爾曲線光束渲染的物體個數。這裡數值太高將很可能會因為大量渲染物件來對遊戲效能有負面影響。   · Show Pointer Cursor(顯示指標游標):在光束終點位置的地面顯示游標。用來看光束終點位置的高度很有用,它可以通過切換這個來關閉。   · Pointer Cursor Radius(指標游標半徑):地面指標游標的尺寸,這個值也會影響貝塞爾曲線光束裡的物件的尺寸。半徑越大,物件尺寸越大。
· Beam Curve Offset(光束曲線偏移): 投射光束時應用的高度偏移量,就算在光束徑直指向時也能產生一個光滑的曲線。   · Custom Pointer Tracer(自定義指標軌跡): 可以在這裡設定一個自定義的遊戲物件用來代替光束軌跡的預設球體。自定義遊戲物件將和控制器的旋轉想匹配。   · Custom Pointer Cursor(自定義指標游標):  可以在這裡設定一個自定義的遊戲物件用來代替指標游標的預設平柱體。     貝塞爾指標物件擴充套件自VRTK_WorldPointer 抽象類並因此發出相同的事件和有效資料。   VRTK_BezierPointer指令碼的例子參見SteamVR_Unity_Toolkit/Examples/009_Controller_BezierPointer場景,它被連同Height Adjust Teleporter指令碼一起使用,來顯示怎樣可以不需要看到物件的頂部就能使用曲線指標來傳送到不同高度的物件上。   另一個例子可以參見SteamVR_Unity_Toolkit/Examples/012_Controller_PointerWithAreaCollision場景,這裡演示了一個開啟了遊玩區游標和碰撞檢測的貝塞爾指標怎樣被用來穿過遊戲區域,但是不允許傳送到牆壁或者其他物件的區域而導致遊玩區讓玩家穿進牆壁。   貝塞爾曲線生成的程式碼是另一指令碼,位置在SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs,這基本是受Catlike Coding的教程和程式碼的啟發(http://catlikecoding.com/unity/tutorials/curves-and-splines/)。

基礎傳送器(VRTK_BasicTeleport)
  基礎傳送器更新[CameraRig]在遊戲世界中的x和z位置到由WorldPointerDestinationSet事件設定定位的世界指標頂端的位置。y位置從不改變,所以基礎傳送器不能用來上下移動遊戲物件而只能水平移動。   基礎傳送器指令碼被新增到[CameraRig] 預製下面並需要一個實現了WorldPointer 的指令碼新增到另一個遊戲物件上(如VRTK_SimplePointer新增到控制器物件上)。   可用指令碼引數如下:   · Blink Transition Speed(眨眼淡入淡出速度):可以在基礎傳送指令碼中改變眨眼漸變速度來提供一個自定義的傳送體驗。速度設定為0意味著沒有漸變眨眼特效呈現。漸變通過 SteamVR Unity 外掛腳本里的SteamVR_Fade.cs指令碼實現。   · Distance Blink Delay(距離眨眼延時): 範圍從0到32,這個值決定了基於被傳送距離的眨眼過渡保持黑屏的時長。值為0時,任何傳送距離都不會延長傳送的眨眼過渡,值為32時,就算距離初始點很近的被傳送距離都會延長傳送的眨眼過渡。這可以被用來模擬使用者傳送更遠的距離花費更長時間。值為16對使用者來說就剛好。   · Headset Position Compensation(頭盔位置補償): 如果勾選,傳送座標將會式遊玩區內頭盔的位置。如果沒有勾選,傳送座標將總是遊玩區中間的位置,就算頭盔位置不在遊玩區中間也式如此。   · Ignore Target With Tag Or Class(忽略帶有標籤或指令碼的目標): 一個指定物件標籤或者物件上新增的指令碼名字的字串,通知傳送器這種目標點應該被忽略,所以使用者就不能傳送到這些位置上。同時也確保指標顏色被設為丟失目標點顏色。   VRTK_BasicTeleport 指令碼的例子可以參見SteamVR_Unity_Toolkit/Examples/004_CameraRig_BasicTeleport場景。這個場景使用控制器上的VRTK_SimplePointer 指令碼在按下grip按鈕時初始化一個鐳射指標,鬆開Grip按鈕時鐳射指標失效,然後玩家傳送到鐳射指標頂端位置。     可調節高度的傳送器(VRTK_HeightAdjustTeleport)
  高度調整傳送器繼承自基礎傳送器,它允許根據傳送位置是否在其他物件頂部來讓[CameraRig]改變y位置。
和基礎傳送器一樣,高度調整傳送器被新增到[CameraRig]預製並需要一個可用的世界指標。   可用指令碼引數如下:
· Blink Transition Speed(眨眼淡入淡出速度):可以在基礎傳送指令碼中改變眨眼漸變速度來提供一個自定義的傳送體驗。速度設定為0意味著沒有漸變眨眼特效呈現。漸變通過 SteamVR Unity 外掛腳本里的SteamVR_Fade.cs指令碼實現。
· Distance Blink Delay(距離眨眼延時): 範圍從0到32,這個值決定了基於被傳送距離的眨眼過渡保持黑屏的時長。值為0時,任何傳送距離都不會延長傳送的眨眼過渡,值為32時,就算距離初始點很近的被傳送距離都會延長傳送的眨眼過渡。這可以被用來模擬使用者傳送更遠的距離花費更長時間。值為16對使用者來說就剛好。
· Headset Position Compensation(頭盔位置補償): 如果勾選,傳送座標將會式遊玩區內頭盔的位置。如果沒有勾選,傳送座標將總是遊玩區中間的位置,就算頭盔位置不在遊玩區中間也式如此。
· Ignore Target With Tag Or Class(忽略帶有標籤或指令碼的目標): 一個指定物件標籤或者物件上新增的指令碼名字的字串,通知傳送器這種目標點應該被忽略,所以使用者就不能傳送到這些位置上。同時也確保指標顏色被設為丟失目標點顏色。
· Play Space Falling(遊玩區墜落):檢查是否玩家是否走出物件,即所在遊玩區的位置不在物件上,然後就會自動傳送到最近的地面上。  
反過來說Play Space Falling 選項是在玩家頭盔在一個物件上方時會自動傳送到一個物件的頂部,這一點在模擬爬梯子時很有用,不需要使用指標光束定位。如果這個選項關閉,玩家就能在他們所站在的物件的同樣y高度的空中行走(也就是有一部分遊玩區在物件外部)。
VRTK_HeightAdjustTeleport 指令碼的例子參見SteamVR_Unity_Toolkit/Examples/007_CameraRig_HeightAdjustTeleport場景。場景有許多不同高度物件,玩家可在來回走或者使用鐳射束爬到它們頂部。   另一個例子參見SteamVR_Unity_Toolkit/Examples/010_CameraRig_TerrainTeleporting場景,展示了玩家也能夠在地形碰撞器上傳送。還有個例子SteamVR_Unity_Toolkit/Examples/020_CameraRig_MeshTeleporting場景中,顯示玩家在網格碰撞器上傳送。
    頭盔碰撞淡出(VRTK_HeadsetCollisionFade)


頭盔碰撞淡出的目的是為了檢測使用者的VR頭盔何時碰撞到其他遊戲物件並淡出螢幕到一個單色。這是為了處理玩家把頭放進一個遊戲物件裡看到物件內部的裁剪,這不是我們所期望的。   之所以這麼做,是因為如果玩家把頭放到不該放的地方就會淡出到一個顏色(如黑色),這就讓玩家意識到他們做錯了什麼,然後可能自然的就會後退。   如果頭盔正在碰撞,那麼傳送行為就被禁用來防止穿插穿牆的作弊。   使用Unity 5.3及之前版本,頭盔碰撞淡出指令碼新增到[CameraRig] 預製的Camera(head)物件上。   使用Unity 5.4及之後版本,頭盔碰撞淡出指令碼新增到[CameraRig] 預製下的Camera (head)裡的Camera(eye)物件上。
可用指令碼引數如下:   · Blink Transition Speed(眨眼淡入淡出速度):碰撞時淡入淡出速度。
· Fade Color(淡出顏色):頭盔碰撞時淡出顏色。   發出事件如下:   · HeadsetCollisionDetect: 當用戶頭盔碰到其他遊戲物件時發出。
· HeadsetCollisionEnded:當用戶頭盔停止碰撞遊戲物件時發出。   發出事件的有效載體內容包括:   · collider: 頭盔所碰撞的遊戲物件的碰撞器。
· currentTransform: 當前頭盔碰撞淡入淡出指令碼所新增到的物件(相機)的Transform。   VRTK_HeadsetCollisionFade 指令碼例子參見SteamVR_Unity_Toolkit/Examples/011_Camera_HeadSetCollisionFading場景。場景在遊玩區周圍有可碰撞的牆壁,如果玩家把頭放進牆壁,頭盔就將漸變成黑色。


玩家呈現(VRTK_PlayerPresence)
  VR使用者在遊戲呈現中有身體這一概念,它通過在使用者站立在遊玩區中的位置新增碰撞和剛體來實現。身體的碰撞和剛體將防止使用者能狗穿過牆壁或者和其他可碰撞物件穿插。碰撞體的高度由使用者頭盔所在高度決定,如果使用者下蹲,碰撞體同樣收縮,這意味著可能在低的空間去下蹲和爬行通過。
可用指令碼引數如下:
· Headset Y Offset(頭盔y偏移):為使用者建立的盒型碰撞體的高度由使用者頭盔位置設定。如果需要碰撞體小一點來讓遊玩區和頭盔之間留有空間的話,這個值將降低生成的盒型碰撞體的高度。   · Ignore Grabbed Collisions(忽略抓取碰撞):如果勾選,任何被控制器抓取的物品都不會和遊玩區的盒碰撞體及剛體發生碰撞。這在使用者需要抓取和揮動物件時是很有用的,因為如果碰撞體啟用,這些抓取的東西就會被遊玩區的碰撞體彈開。   VRTK_PlayerPresence 指令碼例子可參見SteamVR_Unity_Toolkit/Examples/017_CameraRig_TouchpadWalking場景。場景有很多牆體和斜坡,使用者可以用觸控板來四處行走,但是不能穿過這些物件,因為它們是可碰撞的並且剛體物理將不允許發生穿叉。  
觸控板移動 (VRTK_TouchpadWalking)


通過手指在觸控板上滑動來實現用這個指令碼讓遊玩區在遊戲世界中能夠移動。TouchpadWalking指令碼用在[CameraRig]預製上,並且在使用者位置新增一個剛體和盒型碰撞來防止他們穿過其他帶碰撞的遊戲物件。   如果Headset Collision Fade指令碼已經被新增到相機預製上,如果使用者試著和一個物件發生碰撞,那麼他的位置就會被重置為最近的正常的位置。這可能發生在使用者穿過需要躬身的區域中途站了起來和頂部發生了碰撞。與其允許使用者這樣做而引起碰撞問題,倒不如直接移動回到一個正常的位置。這確實破壞了沉浸感,但使用者正在做的事情也是不自然的。
可用指令碼引數如下:   · Left Controller:如果勾選,左控制器的觸控板就能移動遊玩區。在執行時可以被切換。   · Right Controller:如果勾選,右控制器的觸控板就能移動遊玩區。在執行時可以被切換。   · Max Walk Speed:當觸控板被觸控到軸的極限時遊玩區所能達到的最大移動速度。觸控板距離中心越近的位置被觸控,移動速度就越慢。   · Deceleration(減速度):當用戶不再觸控到觸控板時遊玩區從減速到完全停止的速度。這種減速度效果可以減緩可能遭受的移動噁心。   VRTK_TouchpadWalking 指令碼的例子參見SteamVR_Unity_Toolkit/Examples/017_CameraRig_TouchpadWalking場景。場景中有很多牆壁和梯子,使用者可以用觸控板來移動。還有個區域只有使用者蹲下才能穿過。在俯身區域挺起身體將導致使用者閃回他們最近的正常位置。    
VRTK_RoomExtender(遊玩區空間擴充套件)
  這個指令碼允許遊玩區跟隨玩家移動。CameraRig 只在達到定義的圈的邊緣才會移動。目的是為了創造一個虛擬的更大的遊玩區。測試這個指令碼的demo場景為028_CameraRig_RoomExtender。   把指令碼新增到CameraRig來使用。   可用指令碼引數如下:   · Additional Movement Multiplier(額外移動乘數): 圈邊緣的移動放大因數。0就是不移動CameraRig。值越高模擬的遊玩區域就越大,但是也可能就越不令人舒適。
· Head Zone Radius(頭部空間半徑):遊玩區不會發生移動的圓圈尺寸,一切都正常的。如果值太低,在蹲下時就會感到不舒服。  

· Debug Transform(除錯Transform): 這個transform讓玩家周圍的CameraRig不移動圓圈顯示出來。在demo場景裡就是一個在地板上的柱體。記得關閉碰撞。

原文連結:http://www.cnblogs.com/unity3ds/p/5810807.html