006_Controller_UsingADoor 使用控制器開關門
該場景中放置了兩個可交互對象——“門”。把控制器放到門前,按下控制器上面的Trigger鍵可以實現與門的交互。如果門是開著的話,它會關上,反之亦然。
usingdoors
下面詳細的看一下這是怎么實現的。這個場景中相機的起始位置在兩扇門中間的位置,需要走幾步就能到達門前面,門的Collider比它的mesh要大一些,是為了交互方便。該場景中沒有“傳送(Teleport)”功能,讀者可以自己添加,記不起來怎么做的話,翻翻前面的筆記好了。場景中的簡易Door對象是個Cube做的,在Hierarchy中是這樣子的:
DoorObject
Door對象具有Box Collider,Rigidbody和Openable_Door三個組件,我們要詳細看Openable_Door:
Openable_Door
Openable_Door繼承自VRTK_InteractableObject,上篇筆記詳細介紹過該腳本的觸碰與抓取功能,這次來看下Use功能是怎樣的。
Use
這個術語聽起來還是有點奇怪,仔細想想也合理。當你觸碰或者抓住一個物體的時候,想使用該物體進行一些相關的操作時,就必須加一個動作。舉個例子,你拿了一把手槍在手里,想發射一下子彈,就需要Use;你拿了個錄像機,想要開始錄像了,也需要Use。在本例中,控制器已經碰觸到門了,想要把門打開,可以點擊Trigger按鍵使用Use操作把門打開。
想要實現Use操作,需要以下幾步:
控制器對象綁定VRTK_ControllerEvents腳本來監聽控制器按鈕的事件,是關于use和停止use的事件,即AliasUseOn和AliasUseOff,用來確定何時應該use以及停止use。
控制器對象需要綁定VRTK_InteractTouch腳本,用來確定可交互對象是不是被觸碰著,只有有效觸碰的物體可以被use。
可交互物體必須綁定VRTK_InteractableObject腳本,并且isUsable變量要設置為true。
VRTK_InteractUse腳本
Hide Controller On Use: 當use動作開始的時候,隱藏控制器模型。
Hide Controller Delay: 隱藏控制器模型之前的等待時間。
VRTK_InteractableObject腳本
下面是Use部分的參數:
useoptions
Is Usable: 決定物體是否可以使用。
Use Only If Grabbed: 如果選中的話,只有抓住的物體可以使用。
Hold Button To Use: 如果選中的話,需要一直按住use按鍵才能使用;沒有選中的話,use按鍵是toggle的形式,按一次use,再按一次停止use。
Use Override Button: 可以指定一個按鍵,use這個特定的可交互物體。
Pointer Activates Use Action: 如果選中的話,當控制器中發出的World指針光束與該物體相交的時候,可以將會運行Using方法。還取決于Hold Button To Use屬性。如果該物體Hold Button To Use屬性沒選中的話,必須釋放指針按鍵才算use。如果Hold Button To Use選中的話,指針按鍵一直按住也算是use,比如光束劃過物體的時候。
Rumble On Use: 設置物體被use時的觸覺反饋。Strength指的是震動強度,Duration指的是時間長度。
-Allowed Use Controllers: 決定哪個控制器可以進行use動作。
Hide Controller On Use: 可以覆蓋控制器上面的設置。
Openable_Door腳本
該腳本繼承自繼承自VRTK_InteractableObject,對外暴露了flipped和rotated兩個屬性。重寫了StartUsing方法,用來控制門的開關狀態和旋轉方向。場景中放了兩個門,只有一個屬性上不同,即flipped。具體效果可以試一下,門1是只能往一個方向開;門2是朝向相機的另外一側開門。代碼中有相關的計算,僅供參考。:)
參考: