快速上手
· 克隆倉庫 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時是頗有用處的。
預製git
可用預製:
[CameraRig]直接從SteamVR Unity plugin例子——SteamVR/Extras/SteamVR_TestThrow場景中拿來,由於它包含了控制器上相關模型的子物體(這在SteamVR plugin默認預製SteamVR/Prefabs/[CameraRig].prefab中彷佛是缺失的)。 SteamVR_Unity_Toolkit/Prefabs/[CameraRig]能夠被拖到任何場景中,經過VR頭盔和包括模型呈現的VR控制器的追蹤來提供對VR遊戲相機的即時訪問。
幀率顯示github
這個畫布添加一個表示幀率的文本元素到頭盔上。使用這個預製必須把它放到場景中,而後頭盔的相機須要被添加到畫布上。
· 選擇場景中的FremesPerSecondCanvas對象
· 找到Canvas組件
· 設置Render Camera參數爲 [CameraRig]預製裏的Camera(eye)
預製上有不少能夠被設置的參數。展開層級視圖中的FramesPerSecondCanvas對象,顯示子對象FramesPerSecondText並點擊顯示額外參數,這些參數能夠經過FramesPerSecondViewer腳本(能夠在SteamVR_Unity_Toolkit/Scripts/Helper/FramesPerSecondViewer找到)來設置。ide
可用腳本參數以下:
· 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腳本。