快速上手
· 克隆倉庫 git clone https://github.com/thestonefox/SteamVR_Unity_Toolkit.git
· 用Unity3d打開SteamVR_Unity_Toolkit
· 從Unity資源商店導入SteamVR Plugin
· 瀏覽Examples場景作為例子來看腳本的用法
概要
這個工具包提供了很多Unity3d里的常用VR功能,如下(但並不局限於此):
· 帶有通用別名的控制器按鈕事件
· 控制器世界指針(如激光指針)
· 玩家傳送
· 用控制器抓取對象
· 用控制器和對象交互
這個工具類基本是受到 SteamVR Plugin for Unity3d Github Repo的啟發,並基於此。
這個工具存在的原因是因為SteamVR plugin含有令人困惑或不完善的代碼,所以我決定創建一個腳本/資源集合,這在用Unity3d創建VR時是很有用處的。
預制
可用預制:
[CameraRig]直接從SteamVR Unity plugin例子——SteamVR/Extras/SteamVR_TestThrow場景中拿來,因為它包含了控制器上相關模型的子物體(這在SteamVR plugin默認預制SteamVR/Prefabs/[CameraRig].prefab中似乎是缺失的)。 SteamVR_Unity_Toolkit/Prefabs/[CameraRig]可以被拖到任何場景中,通過VR頭盔和包括模型呈現的VR控制器的追蹤來提供對VR游戲相機的即時訪問。
幀率顯示
這個畫布添加一個表示幀率的文本元素到頭盔上。使用這個預制必須把它放到場景中,然后頭盔的相機需要被添加到畫布上。
· 選擇場景中的FremesPerSecondCanvas對象
· 找到Canvas組件
· 設置Render Camera參數為 [CameraRig]預制里的Camera(eye)
預制上有很多可以被設置的參數。展開層級視圖中的FramesPerSecondCanvas對象,顯示子對象FramesPerSecondText並點擊顯示額外參數,這些參數可以通過FramesPerSecondViewer腳本(可以在SteamVR_Unity_Toolkit/Scripts/Helper/FramesPerSecondViewer找到)來設置。
可用腳本參數如下:
· Display FPS:FPS文本可視切換。
· TargetFPS:認為可接受的幀率,被用來作為改變FPS文本顏色的基准。
· Font Size:FPS顯示字體尺寸。
· Position:FPS 文本在頭盔視野的位置。
· Good Color:當處在目標FPS的合理范圍之內的FPS文本顏色。
· WarnColor:當FPS降到低於目標FPS合理范圍的FPS文本顏色。
· Bad Color:當FPS處在相對目標FPS為不合理水平時FPS文本的顏色。
FramesPerSecondCanvas 預制的例子可以在SteamVR_Unity_Toolkit/Examples/018_CameraRig_FramesPerSecondCounter場景中找到,在頭盔視野中間顯示了幀率。按下扳機鍵(trigger)生成一個新的小球,按下觸摸版(touchpad)生成10個新的小球。通過最終當很多小球出現的時FPS將下降來演示這個預設。
腳本
這個目錄包含了所有添加到Unity的VR功能的工具腳本。
當前可用腳本有:
控制器行為腳本提供了處理常見控制器行為的幫助方法。如下可用公共方法:
· IsControllerVisible(): 如果控制器模型是可見的返回真,否則返回假。
· ToggleControllerModel(bool on):根據所給布爾值狀態設置控制器模型的可見性。如果傳入true,控制器模型就被顯示出來,如果傳入false,控制器就被隱藏了。
· TriggerHapticPulse(int duration, ushort strength):啟動控制器開始震動,根據給定的持續計時(第一個參數)和震動強度(第二個strength參數)。最大強度可以是3999,超過就限制為3999。
VRTK_ControllerActions腳本的例子在SteamVR_Unity_Toolkit/Examples/016_Controller_HapticRumble場景中,展現了隱藏控制器和讓控制器在給定強度下震動給定時長的能力。
控制器事件(VRTK_ControllerEvents)
控制器事件腳本被添加到 [CameraRig]預制里的控制器對象上,為控制器上的每個按鈕按下提供事件監聽(除了系統菜單按鈕,因為這個按鈕不能被重載,只能總是由Steam使用)。
當一個控制器按鈕被按下,腳本發出一個事件表明按鈕被按下了,這使得其他腳本去監聽這個事件而不需要實現任何控制器邏輯。
腳本也有一個公共的布爾類型的按下狀態變量,允許被其他腳本查詢按鈕是否被按下。
當一個控制器按鈕被釋放,腳本也發送一個事件表示按鈕被釋放了。
控制器觸摸板有兩個狀態,既可以用戶只把手指放到壓力傳感板上來觸摸,也可以用戶在板上按下去直到發出聲響來點擊。
控制器事件腳本同時分別處理觸摸板觸摸和點擊事件。
控制器上有兩個按鈕軸:
· 觸摸板觸摸位置,位置的x和y值基於觸摸板當前被觸摸位置。
· 扳機按鈕,有個基於扳機鍵被按下去程度的x值。
當觸摸板的軸或者扳機鍵的軸值改變時,會有兩個額外的事件發出,這可以被用來確定兩個軸的變化來進行精確控制,如用觸摸板來移動角色,或者知道扳機鍵被按下程度。
觸摸板的軸由變量TouchpadAxis 記錄,在所有控制器事件的腳本中更新。
扳機鍵的軸由變量buttonPressure 記錄,在所有控制事件腳本中更新。任何其他按鈕按壓只記錄一個為1或者0按鈕壓力,因為所有其他按鈕都是數字量(要么就是點擊要么就沒有),但扳機是一個可以記錄不同按鈕壓力的模擬量。
軸值變化的精確度可以由腳本中的axisFidelity 參數來決定,默認值為1。值只要超過2就可能會產生靈敏過度的結果。
事件發出的有效載體信息包含:
· controllerIndex:所使用控制器的索引。
· buttonPressure:0到1的浮點數,表示按鈕按下的所施加的壓力值。
· touchpadAxis: 一個表示觸摸板觸摸位置的Vector2類型變量。
· touchpadAngle:一個表示觸摸板觸摸位置的轉動位置的浮點數,0是頂部,180是底部,其他角度隨之對應。
當控制器被按下時也會有通用動作的別名事件被發出。這些動作別名可以被映射到想要的控制器按鈕上。這些別名是:
· Toggle Pointer:打開關閉鐳射棒
· Toggle Grab:抓取游戲對象
· Toggle Use:使用對象
· Toggle Menu:打開一個游戲內菜單
每個上面的別名都可以通過在腳本參數窗口的下拉欄里選擇映射其使用到喜好的控制器按鈕上。
當所設置的映射按鈕被按下時將發出一個實際按鈕事件以及一個額外別名開啟的事件。當按鈕釋放的時候就發出一個實際按鈕事件以及一個額外的別名關閉的事件。
監聽這些別名事件而不是實際的按鈕事件意味着可以很輕易的自定義控制器按鈕到它們應該執行的行為上。
VRTK_ControllerEvents腳本的例子可以在SteamVR_Unity_Toolkit/Examples/002_Controller_Events場景中看到,事件怎樣被使用和監聽的代碼例子可以參見SteamVR_Unity_Toolkit/Examples/Resources/Scripts/VRTK_ControllerEvents_ListenerExample.cs腳本。
