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場景里就是一個在地板上的柱體。記得關閉碰撞。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM