看到一篇很好的Steam VR腳本的詳細解析文章,為了方便自己以后找得到,特意轉載了。
大家都知道現在基於Unity開發Vive的應用程序都需要用到SteamVR這個插件,接下來的系列會重點分析該插件中和開發相關的功能。首先介紹的是Vive手柄控制器開發的介紹,基本包含了手柄功能開發的所有信息。如有不全歡迎補充討論。使用時需要注意的點我會用綠色標出了,對整個腳本執行過程不感興趣的可以着重看一下綠色部分,開發時注意就好了。
關於控制器的相關信息都包含在SteamVR_Controller這個腳本之中。注意:SteamVR_Controller是非Monobehavior的腳本,並沒有掛在場景下,其運行是通過SteamVR_Render腳本對於其中Update()函數的調用從而一直循環獲取手柄相關信息。而SteamVR_Render腳本是在程序運行時自動加載至場景的。先來看看腳本的全貌吧。
ButtonMask類:手柄各按鍵的名稱。
Device類:最重要的類,封裝了跟蹤設備的全部信息。
Update()函數:被SteamVR_Render腳本調用,更新各跟蹤設備的信息。
Input()函數:根據Index初始化Device[]數組,並實例化所有16個Device。
DeviceRelation和GetDeviceIndex()結合獲取特定的設備Index,如leftmost、rightmost。在SteamVR_TestController腳本中有使用到該函數獲取用戶的左右手手柄的Index。用該方法應該可以識別出用戶所拿的手柄是哪一個。
針對按鍵的三個函數,每種函數有兩個重載,參數為ButtonMask或EVRButtonId類,第二種形式會將EVRButtonId轉換為ButtonMask后調用第一種得到結果。
針對Touchpad的三個函數,一樣的兩種形式,同上不解釋。
手柄震動控制函數,參數名稱解釋的是時間,默認500,但實際上控制的是震動的強度。默認AxisId是EVRButtonId_touchpad,選擇其他EVRButtonId沒用(等價參數axis0可以),其會調用OpenVR中的同名函數。參數超過4000會無效,導致震動不觸發。可以通過協程的while(true)+waitforsecond控制震動間隔,通過stop協程控制震動結束。
這三個函數獲取HairTrigger的狀態,其值對應rAxis1.x的值。But什么是HairTrigger?形象點說就是像頭發般輕輕的觸發。HairTrigger是檢測當你握住扳手超過一個固定值(0.1,可調)時即觸發的狀態。相當於利用Trigger的變化量來做一個功能的觸發,很棒不是嗎。輕輕碰一下Trigger使得行程大於0.1即可觸發一個功能。 整個腳本的執行順序如下:
轉載出處:http://www.chinaar.com/ZYJC/1090.html