PlayerSetting設置以下:html
啓動虛擬現實驅動,sdk選擇OpenVR。HTC Vive只支持OpenVR。node
Unity Input設置:git
官方手冊設置說明: https://docs.unity3d.com/Manual/OpenVRControllers.htmlgithub
按照手冊進行配置,左手菜單按鈕設置爲:api
左手觸摸板觸摸位置獲取設置爲:ide
X軸設置:測試
Y軸設置:ui
其他按鈕以例根據官方手冊在Input中進行配置便可。.net
基礎環境配置配置完成,VR硬件鏈接正確時只要場景中存在相機便能實現頭部的定位跟蹤,先基礎角色配置如圖:插件
手部定位追蹤依賴於組件:
Device:
制定要追蹤的設備類型,XRDevice:XR設備(包括頭部,眼睛位置的追蹤)用於HMD和AR移動設備的位置追蹤。
XRController:控制器設備的(左手和右手控制器)
XR Remote:XR遙控器,用於移動遙控器(此值暫未用到)
PoseSource 要追蹤設備位置來源。
UseRelativeTransform:是否使用對象的原始轉換做爲基礎(暫未明白其含義)
以左手控制器爲例:
//點擊左手菜單按鈕
if (Input.GetButtonDown("LTMenu"))
{
Debug.Log("按下左手菜單按鍵");
}
//觸摸左手Touchpad
if (Input.GetButton("LTTrackpadTouch"))
{
float x = Input.GetAxisRaw("LTTrackpadHorizontal");
float y = Input.GetAxisRaw("LTTrackpadVertical");
Debug.LogFormat("觸摸左手手柄觸摸板:X:{0},Y:{1}", x, y);
}
if (Input.GetButton("LTTrackpadPress"))
{
Debug.Log("按下左手觸摸板");
}
if (Input.GetButton("LTrigglerTouch"))
{
float value = Input.GetAxis("LTrigglerSqueeze");
//Debug.Log("觸摸左手Trigger按鍵,按鍵角度:" + value);
Debug.Log("觸摸左手Trigger按鍵,按鍵角度:" + value);
}
if (Input.GetAxis("LGrip")>0)
{
//Grip按鍵的值鬆開時爲0,按下時爲1,沒法取得中間值。
Debug.Log("按下左手Grip按鍵");
}
以上需在update中輪詢監聽,經測試,Axis輸入的值準確度有差別,具體緣由未知。
InputTracking.nodeAdded += (XRNodeState nodeState) => { Debug.Log("設備鏈接:" + nodeState.nodeType.ToString()); }; 每當有設備鏈接時便會執行此設備,設備類型包含:左眼,右眼,中間的眼,左右控制器等。
InputTracking.nodeRemoved += (XRNodeState nodeState) => { Debug.Log("設備斷開鏈接:" + nodeState.nodeType.ToString()); }; 當設備斷開鏈接時會執行的事件
InputTracking.trackingAcquired 設備正確響應時會執行的事件
InputTracking.trackingLost 設備定位丟失時會執行的事件
設備位置和旋轉的獲取。
2.其他VR設置相關的有 XRSetting和XRDevice等能夠在Unity幫助內查看。
在Assets Store中下載最新版的SteamVR插件,導入完成後直接在project面板中查找Player便可,將其拖到場景中便可實現基礎的瀏覽。
1) 事件配置
比較老版本的事件,如今的事件系統更加靈活,但基礎添加更加依賴於配置。以手柄的觸摸板爲例,有點擊、觸摸、觸摸位置3個事件能夠編輯,其編輯步驟爲:
第一步:
打開window下的 SteamVRInput編輯界面,
通常是默認選中 default事件的,不用更改。
Actions 下In則爲要輸入的事件,out爲輸出事件。通常系統會默認一系列事件不須要可直接刪除。
點擊In裏面的「+」:
Name爲當前事件的名字,Type爲事件的返回值類型,Required目前測試3種選擇沒有區別,Localized String直接設置爲當前事件的名字同樣便可。
這裏定義了一個觸摸板觸摸的事件,觸摸板是否觸摸返回的類型爲bool因此類型選擇爲boolean,編輯完成以後點擊save and generate按鈕便可。以後程序便會生成一個對應類型的Action類打包成 .assets文件,並把類的定義寫入到SteamVR_Input_ActionSet_default_In
觸摸板觸摸位置獲取事件定義以下:
第二步:將按鈕和事件進行綁定
點擊 Open binding UI按鈕,打開編輯界面以下:
點擊 Edit按鈕進行編輯:
若是兩個手柄的事件是同樣的則勾選 Mirror Mode按鈕,若是須要分別編輯則不須要勾選此按鈕。
Left Vive Controller下面的則爲左手柄事件編輯界面,下拉界面找到以下位置:
此爲觸摸板編輯界面,將鼠標移入在左下角會顯示編輯按鈕,點擊按鈕進行編輯。
點擊Touch後面的None:
點擊 TouchPadTouch,綁定觸摸事件。而後再按上述步驟綁定觸摸位置獲取事件,最終按鈕事件綁定以下:
點擊對號按鈕保存編輯。點擊
按鈕,點擊save便可保存。其他手柄按鈕事件皆能夠此爲例進行編輯。
相較於老版本的事件系統,此事件系統能夠方便的對不一樣的手柄設備進行匹配,減小不一樣手柄時代碼上的更改。
2) 手柄按鍵事件調用
調用代碼示例:
參考文件:http://www.cnblogs.com/lys12138/p/9849115.html
手柄與物體的交互包括碰到物體,移出物體,和抓住物體。
相關腳本爲:
Interactable,控制抓取物體時物體和手柄的狀態。
InteractableExample:基礎的交互。
目前SteamVR所支持的交互只限於button按鈕,須要在button上添加boxcollider和UIElement,這樣就能實現手柄去觸摸UI按鈕而後點擊。目前不支持射線點擊UI。要實現射線點擊UI須要對EventSystem進行修改。
官方射線移動相關的預製體爲Teleporting,關鍵的腳本爲: Teleport和Teleport Arc用於控制角色移動,檢測是否可移動。能夠移動的地點物體上須要添加腳本:TeleportArea(根據物體的碰撞進行斷定是否能夠移動)
備註:該版本的SteamVR解決了角色在牆邊穿模問題,也就是說如今的角色沒法再穿越牆體碰撞。不須要使用角色碰到牆體屏幕變黑來提醒角色。
底層 API OpenVR:
OpenVR十二個驅動接口:https://blog.csdn.net/dabenxiong666/article/details/68954398
Unity插件(SteamVR深度分析)http://gad.qq.com/article/detail/27028
--基於steamVR 1.10版本,有關於 OpenVR api部分講解。
API Document: https://github.com/ValveSoftware/openvr/wiki/API-Documentation