VRTK使用心得(六):優化使用者體驗——防穿牆及自動墜落
我們知道在VR中,尤其是像HTC VIVE或Oculus這樣的裝置,體驗者除了能夠使用瞬移來移動自身位置,還可以在空間小範圍地自主移動,當距離一面牆或者障礙物比較近的時候,體驗者的頭部可以穿過牆面或障礙物的模型,看到裡面的內容(CS穿牆既視感),比如在VR房產專案中,使用者會看到隔壁房間的內容,個別會有閃躲的動作,這種體驗顯然與現實不符,從而影響到沉浸感;另外,同樣是由於自由移動引起的問題,當體驗者瞬移到一個有高度的地方以後,比如高塔、樓梯等,當走出這個高度的範圍,並沒有因為重力而下落,而是懸停在了空中,這也是影響使用者體驗的地方。
VRTK對於這兩方面都有對應的優化措施,首先,對於穿牆,使用VRTK_HeadsetCollisionFade元件,能夠在檢測到使用者與物體發生碰撞以後做一個黑屏效果,這樣體驗者就會本能地退出這個區域(如下圖),在PlayArea(見VRTK的基本配置,PlayArea用來掛載瞬移相關元件)上新增指令碼以後,使用者頭盔與碰撞體發生碰撞,場景會有一個逐漸變黑的過程。
需要說明的是:當新增VRTK_HeadsetCollisionFade以後,會自動掛載另外兩個元件:
1.VRTK_HeadsetCollision:用來檢測頭盔與碰撞體的碰撞,當單獨掛載這個指令碼的時候,可以獲取到這個指令碼,使用HeadsetCollisionDetect事件來檢測碰撞發生,然後撰寫自己的碰撞檢測邏輯,比如除了黑屏,還可以播放提示音,顯示提示UI等。
void Start () { GetComponent<VRTK_HeadsetCollision>().HeadsetCollisionDetect += CollisionDetect_HeadsetCollisionDetect; } private void CollisionDetect_HeadsetCollisionDetect(object sender, HeadsetCollisionEventArgs e) { //你的處理邏輯 }
2. VRTK_HeadsetFade:用來實現黑屏。當單獨掛載時,可以在除了頭盔碰撞之外,呼叫其Fade()函式來實現黑屏效果,傳遞顏色及持續時間引數。
對於自動墜落,VRTK提供了VRTK_BodyPhysics這個元件,同樣是掛載到PlayArea上,當體驗者移出高度範圍的區域,會因為重力自動墜落到能夠承載其的下一個高度。調節引數Gravity Fall Y Threshold,設定引起墜落的值,如下圖,如果設定為1,則距離下一個高度大於1米時下落。
其原理是,VRTK在執行時,會在CameraRig上新增兩個Collider,一個“代表”Body,一個“代表”Foot,如下圖:
FootCollider通過檢測碰撞,當沒有碰撞時,則認為懸空,繼而實現下落。
以上是VRTK中對於因為使用者自由移動引起的使用者體驗的優化,希望對你有幫助,歡迎指正。