SteamVR Unity Plugin - v2.0.1中的InteractionSystem
最近寫VR專案的時候用到了SteamVR Unity Plugin - v2.0.1外掛,感覺比之前用到的SteamVR plugin for Unity - v1.2.2版本改進了很多,就算不用VRTK外掛,也能實現很多互動操作了。在此記錄一下新版本外掛的中的主要內容。(主要是根據InteractionSystem 文件和自己的理解)
這個InteractionSystem包括一系列指令碼,預製件和其他資產資源,這個系統專門設計的輕巧靈活。。其中大多數包含的元件在實際案例中都運用到了,但也包括一些沒有在案例中用到的元件,但是它可能也是有用的。
1.首先概述一下示例場景中包括的預製件和指令碼主要的功能:
Player:這個預製件是整個系統的核心,大多數其他元件都依賴於player
Teleporting:傳送預製件處理所有關於傳送的邏輯。
InteractableExample:這個類是一個和手柄進行簡單互動的類。會接收手柄發來的資訊並作出反應。
Throwables:這個展示了在遊戲中怎樣使用互動系統來建立一些更復雜的能夠被使用的物件。
UI&Hints:這個顯示了互動系統如何處理提示。並且如何使用它和Unity UI控制元件像按鈕一樣進行互動。
LinearDrive:這是一個稍微複雜的互動,可以通過簡單的直線移動操作物件來控制的目標物件進行螺旋上升和下降。
CircularDrive:這個類主要實現了通過手柄控制一個圓盤的轉動
Longbow:這是案例中使用的長弓。是這個系統建立的更復雜的物件之一。
2.簡單介紹互動系統
互動系統的核心是Player,Hand和Interactable類。Player預製件為場景設定play物件和SteamVR攝像機。這個互動系統通過傳送資訊給場景中所有可以和手柄進行互動的物件,這個物件再對接收的資訊作出反應。並可以設定物件附著到手柄上。為了接收手的資訊只要新增Interactable元件到物件上,這個物件就可以根據手的資訊作出相應的懸停監測。還包括了一些常用的可互動方式,例如Throwable(扔)或者LinearDrive(直線移動物體)。Player預製件也建立了一個用於模仿滑鼠事件可以簡單地用Unity UI控制元件控制的輸入模式。互動系統也包括一個傳統的第一人稱攝像機,用鍵盤和滑鼠控制。滑鼠就類似人的一隻手一樣。當開發者沒有VR頭顯時,這個模式就非常有用了。
3.Player類的功能介紹
-Player類是一個單例,意味著在一個場景中只有一個Player物件。
-Player主要功能是持續追蹤手柄和頭顯。
-它可以在整個專案中全域性訪問,並且互動系統的許多方面都假定Player物件始終存在於場景中。
-不管是VR模式還是2D fallback模式,它都保持追蹤。
-通過Player類使用訪問器允許其他元件以類似的方式執行,而不知道是否正在使用VR頭顯或滑鼠/鍵盤。
-2D fallback模式雖然有用,但仍然有限制。此模式主要用於測試非常簡單的互動,僅限於一個手和觸發按鈕。它對於一個團隊在開發中,並不能保證每個人一直都有一個VR頭顯和控制器裝置。
-Player的一些有用的屬性:
-hmdTransform:一隻返回當前攝像機的transform。可能是VR頭顯和2D fallback camera。
-feetPositionGuess:根據頭顯的位置猜測玩家腳的位置。但不能準確知道腳的位置,根據玩家的站立方式,這可能非常不準確。
-bodyDirectionGuess:類似於feetPositionGuess,根據玩家的站立方式,這可能非常不準確。
注意:在編輯場景中,player類設定使用icons顯示feet和hands。但由於unity工作方式,需要將Core/icons移動到根目錄下Gizmos中,才能起作用。
-關閉2D fallback mode的兩種方式:
1、在build之前,將player的屬性面板中Allow Toggle To 2D取消勾選
2、在PlayerSetting.Player中Scripting Define Symbols增加HIDE_DEBUG_UI。這將會在build時取消2D debug view,但允許在編輯器中使用。
4.Hand類的功能介紹
-Hand類為互動系統完成了大部分繁重工作。
-Hand檢測正在懸停的物件(Interactables)並根據當前的懸停狀態向它們傳送訊息。
-hand在同一時間只能懸停在一個物件,在相同時間只能有一隻hand能懸停在一個物件。
-物件可以附著在手柄上,也可以從手柄上分離。只有一個物件可以是手柄的焦點物件,但是同時可以將多個物件附加到手柄上。
-一旦一個物件從手柄上分離,那麼之前附著在手柄上的物件(仍然附著在手柄上)會成為手柄的焦點物件。
-當手柄上沒有任何東西時,它將始終顯示手柄控制器。
-當物件一旦附著在手柄上時,可以給附著在手柄上的物件可以設定一個附著標誌物UI來確定手柄和物件的行為。
-根據情況,可以鎖定手柄以懸停在其他物體或任何物體上。
-這些是hand傳送給互動物體的資訊:
OnHandHoverBegin: 當手柄首次開始懸停在物件上時傳送
HandHoverUpdate: 懸停在物件上時,每一幀都發送資訊
OnHandHoverEnd: 當手柄停止懸停在物件上時傳送
OnAttachedToHand: 當物件附加到手柄上時傳送
-HandAttachedUpdate: 附加到手柄上時,每一幀都發送資訊
OnDetachedFromHand: 當物件從手柄中分離時傳送
OnHandFocusLost: 當附加物件失去焦點時傳送,因為其他東西已附加到手柄上
OnHandFocusAcquired: 附加物件獲得焦點時傳送,因為前一個焦點物件已從手柄中分離
- 這些是手柄傳送給其子物件的訊息:
OnHandInitialized: 通過將自己與SteamVR跟蹤控制器的裝置ID相關聯來首次初始化手柄時傳送
OnParentHandHoverBegin: 當手柄開始懸停在某物上時傳送
OnParentHandHoverEnd: 當手柄停止懸停在某物上時傳送
OnParentHandInputFocusAcquired: 當遊戲視窗獲得輸入焦點時傳送
OnParentHandInputFocusLost: 當遊戲視窗失去輸入焦點時傳送
- 這些成員處理附加和分離:
AttachObject: 將傳入的附加標籤設定在附著物件上
DetachObject: Detaches the object from the hand and optionally restores it to its original parent currentAttachedObject: This returns the in-focus attached object on the hand,if any
- Hand還有一些有用的屬性和函式可用於自定義其行為:
OtherHand: 這是玩家控制的另一隻手柄。這對於需要用兩個手柄互動的物件(例如長弓)非常有用。
HoverSphereTransform and Radius: 這可用於自定義手柄的懸停範圍。
HoverLayerMask: 這可以改變,以便手柄只懸停在某些層中的物件上。
HoverUpdateInterval: 根據遊戲的要求,可以設定進行懸停檢測的時間間隔。
HoverLock/Unlock: 這用於使手柄僅懸停在某個物件上。當hover locked時,傳入為null將使得手柄不會懸停在任何東西上。此技術用於在傳送arc處於活動狀態時使手柄不懸停在物件上
GetStandardInteractionButton/Up/Down: 這些用於檢查手柄上的扳機的狀態。 這對於也可以與2D fallback一起使用的簡單物件非常有用。 在2D fallback情況下,左鍵單擊用作標準互動按鈕,物件的行為相同。
GuessCurrentHandType: 這使用一些SteamVR函式來確定哪個手柄最左邊哪個是最右邊的。
GetAttachmentTransform: 物體可以使用手上的“attachment transforms”來弄清楚如何附著到手柄上的transform。
5. Interactable類 更像是一個識別符號。它向Hand標識該物件是可互動的。具有此元件的任何物件都將從Hand接收相關訊息。
僅使用以上這3個元件,就可以能夠建立許多不同且複雜的互動式物件。
6.Throwable類的主要功能:
這是最基本的互動式物件之一。
- 當手柄在其上懸停並按下互動鍵(扳機)時,玩家可以拾取此物件。
- 按下扳機時,物體會附在手柄上並保持在那裡。
- 當釋放扳機時,手柄的速度都會賦給丟擲物件。
- 這可以建立可以拾取和丟擲的基本物件。
7. LinearDrive類 的主要功能是允許用手柄在開始和結束點之間移動物件,物件的當前位置用於設定LinearMapping。
8. CircularDrive類 的主要功能是允許用手柄控制圓盤轉動。物件的當前位置用於設定LinearMapping。
9. LinearMapping 值由LinearDrive和CircularDive設定
-對映可用於將簡單的手部互動對映到更復雜的行為。
-一個例子是長弓中的字串,它使用LinearMapping將弓弦的拉動對映到長弓拉回動畫。
-幾個其他類使用該對映來插入其屬性
LinearAnimation
LinearAnimator
LinearBlendShape
LinearDisplacement
HapticRack
10. VelocityEstimator類 可用於根據物件位置的變化估計物件的速度和加速度。在大多數情況下,如果從實際控制器獲得速度和加速度,將獲得更準確的結果,但有時這是不可能的,例如使用2Dfallback hand時。
11. IgnoreHovering類 主要功能是,當你希望某物件不進行懸停檢查時,則可以將此元件新增到該物件或特定的碰撞器上。
12.UIElement類的主要功能:
將此元件新增到unity的UI控制元件上,則手就可以與UI進行互動。
這將生成基於手部互動的滑鼠懸停和單擊事件,並通過Unity事件系統傳送它們以使用現有的UI控制元件。
此外,它還將生成一個OnHandClick事件,該事件也將傳遞到點選的那個手柄。
13.ItemPackage類的主要功能:
-ItemPackage是用於暫時覆蓋手柄的功能的物件集合
-在長弓的例子中,當長弓被手柄拿起後,長弓和手柄就結合在一起,並暫時替代手柄的功能。
-ItenPackages的概念是能夠撿起和放回到物體被撿起的地方。
-一旦附帶ItemPackage元件的物件被拿起,此物件會附著在手柄上,直到此物件被放回。不需要按鈕就可以讓此物件保持在手柄上。手柄仍然可以正常的傳遞訊息(與場景中的物件互動),但此物件通常會禁用手柄的某些功能,例如手柄的懸停功能。
14. ItemPackageSpawner 指令碼處理產生和收起ItemPackage時的邏輯,以及如何在產生後將物品附加到手柄上。還可以處理拾取物件的展示和預覽或者拾取物件的輪廓。
15. ItemPackageReference 可以將此元件新增到物件以指示它是組合物件的一部分。
16. PlaySound 這個類允許使用更多引數來使用AudioClips。可以接收多個AudioClips並且每次隨機播放一個。還可以隨機播放剪輯的方式。
17. SoundPlayOneShot類 專門用於播放一次且不迴圈播放的聲音或者需要在播放時暫停的聲音。
18. Util類 中全是interaction system中用到的工具方法。
19. InteractableHoverEvents 當收到手柄傳遞的資訊時這個類生成UnityEvents。
20. InteractableButtonEvents 此類將手柄按鈕輸入轉換為UnityEvents。
21. ComplexThrowable類 當手接觸物件時使用物理關節而不是simple parenting,這允許在手接觸物件時進行更多基於物理的互動。
注意:這個類是實驗性的,還沒有真正運用到場景中,此類的功能是不完整的並且可能有錯誤。
22. DistanceHaptics 基於兩個transform之間的距離觸發手柄的震動反饋。
23.Player(Prefab)功能
-這是互動系統的單個部分,它結合了所有基本部分
-這個預製件管理玩家和手部,使他們都可以輕鬆訪問。
-包括所有SteamVR和2Dfallback的設定
-互動系統的大多數的元件都依賴於Player預製件,並且一些元件假設player和hand都用這種方式設定。
-每個場景只有一個。
24. BlankCOntroller(Prefab) 當手柄沒有接觸任何東西時使用,控制器的渲染模型通過SteamVR載入,其所有部件都是鉸接式(articulated)的。