1.設備的安裝與配置 https://wenku.baidu.com/view/fa172fd7482fb4daa48d4b44.html?from=searchhtml
2.接入SDK、實現簡單示例場景、更換手柄模型、實現手柄投擲功能
導入SteamVR Plugin.unitypackage
實現頭盔觀看功能
更換手柄模型
要點
把物體拖到model同級目錄,座標歸零
在運行狀態下調整模型的大小座標和旋轉值
複製組件value,而後取消運行,粘貼value到物體上
實現手柄投擲功能
按下trigger鍵在手柄上生成一個物體,鬆開trigger鍵投擲出去測試
3.手柄腳本講解
手柄上各按鍵的輸入
扳機鍵:trigger
菜單鍵(三橫)menu:
側邊鍵(兩個同樣):grip
圓盤(可點可觸摸):touchpadspa
1 using UnityEngine; 2 using System.Collections; 3 using Valve.VR; 4 using UnityEngine.iOS; 5 using System.Runtime.CompilerServices; 6 7 public delegate void VRHandle(); 8 9 10 11 public class VRInput : MonoBehaviour 12 { 13 14 SteamVR_TrackedObject trackedObject;//獲取手柄對象 15 SteamVR_Controller.Device device;//定義手柄信息對象 16 17 public VRHandle onTrigger; 18 public VRHandle onTriggerDown; 19 public VRHandle onTriggerUp; 20 21 void Start() 22 { 23 // 首先要獲取響應按鍵的設備 24 trackedObject = GetComponent<SteamVR_TrackedObject>(); 25 device = SteamVR_Controller.Input((int)trackedObject.index); 26 } 27 28 Vector2 startPoint; 29 Vector2 endPoint; 30 //獲取觸摸偏移 ,旋轉左手零件庫,小部件什麼的。 31 public float GetTouchPadDeltaPos(SteamVR_Controller.Device device) 32 { 33 if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0)) 34 { 35 endPoint = startPoint = device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad); 36 } 37 38 //按下後滑動 39 if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis0)) 40 { 41 42 if ((device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad) - endPoint).sqrMagnitude > 0.01f) 43 { 44 45 startPoint = endPoint; 46 47 endPoint = device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad); 48 49 //Vector2 deltaVector = endPoint - startPoint; 50 //float deltaPosY = endPoint.y - startPoint.y; 51 52 float deltaPosX = endPoint.x - startPoint.x; 53 54 //使用delta 55 //device.TriggerHapticPulse (1000); // 用這個能夠震動手柄 56 //target.Rotate (0, 0, deltaPosX * 100); 57 return deltaPosX; 58 } 59 } 60 return 0f; 61 } 62 63 64 65 void Update() 66 { 67 68 // Press 和 Touch 除了圓盤,其餘基本通用 Touch能夠直接響應圓盤 69 // GetPressDown 和 GetTouchDown 70 // GetPress 和 GetTouch ___ 相似鍵盤的GetKey 71 // GetPressUp 和 GetTouchUp 72 //如下不全寫了,不必,就主要以GetTouch 試一下全部按鈕 73 74 //按下圓盤 75 76 if (device.GetPress(SteamVR_Controller.ButtonMask.Touchpad)) 77 { 78 //打印觸摸的位置 79 print(device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad)); 80 } 81 82 // Trigger鍵 83 if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger)) 84 { 85 Debug.Log("我是手柄上的trigger鍵,保持按下狀態"); 86 if (onTrigger!=null) { 87 onTrigger (); 88 } 89 90 } 91 92 if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger)) 93 { 94 Debug.Log("我是手柄上的trigger鍵,按下狀態"); 95 if (onTriggerDown!=null) { 96 onTriggerDown (); 97 } 98 99 } 100 if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger)) 101 { 102 103 Debug.Log("我是手柄上的trigger鍵,鬆開狀態"); 104 if (onTriggerUp!=null) { 105 onTriggerUp (); 106 } 107 } 108 109 //觸摸圓盤 110 if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad)) 111 { 112 Debug.Log("我是左手柄上的觸摸屏,手指保持觸摸狀態"); 113 } 114 115 // 菜單鍵 (三橫線) 116 if (device.GetTouch(SteamVR_Controller.ButtonMask.ApplicationMenu)) 117 { 118 Debug.Log("我是手柄菜單鍵,保持按下狀態"); 119 } 120 121 //手心鍵(隨便取個名^^) 左右兩邊能夠按但實際上是一個鍵! 122 if (device.GetTouch(SteamVR_Controller.ButtonMask.Grip)) 123 { 124 Debug.Log("我是左手柄左右側按鍵,保持按下狀態"); 125 } 126 127 // 這些鍵位都有了!! 好像還有個System鍵把!!能用嗎? 通過短期測試,不要用,沒效果不說,容易致使其餘的都不靈還要從新鏈接手柄! 128 //查看定義能夠知道: public const ulong System= (1ul << (int)EVRButtonId.k_EButton_System); // reserved reserved了,reserved什麼意思?保留! 不是留留給你的 ^ ^! 129 if (device.GetTouch(SteamVR_Controller.ButtonMask.System)) 130 { 131 print("你看不見我!"); 132 } 133 134 //如下三個獲取 追蹤設備的姿態(矩陣等信息),按鍵的狀態等等,請自行研究,歡迎回帖補充 135 device.GetPose(); 136 device.GetState(); 137 device.GetPrevState(); 138 139 //還沒完!繼續 140 // vive 有個Trigger鍵,有必定鍵程,那麼你按下這個trigger到什麼程度會觸發呢? 141 //通過測試,大概是 75%的樣子!!(why?爲何要研究這個,有意義麼? Of Course!) 142 // 由於 device.GetHairTrigger(), hairTrigger:一觸即發的意思!就是說Trigger鍵你能夠輕輕一碰就能觸發! 143 if (device.GetHairTriggerDown()) 144 { 145 print("看到我時,食指不要動,看你按到了多少?"); 146 } 147 // 你確定按了0.1,也就是10%的鍵程,我怎麼知道? 148 //print("由於你按了:" + device.hairTriggerDelta); 149 // 那麼,修改了hairTriggerDelta,是否是就修改了 一觸即發的鍵程? √ 150 151 //修改一觸即發鍵程爲一半,再按按試試看! 152 if (Input.GetKeyDown(KeyCode.A)) 153 { 154 device.hairTriggerDelta = 0.5f; 155 } 156 157 158 // 最後! 159 //Axis,軸 160 //經測試,Axis0對應的是圓盤SteamVR_Controller.ButtonMask.Touchpad ,均可以用 161 //Axis1,對應的是trigger鍵位! 162 // 在SteamVR_Controller.ButtonMask類裏面定義了還有2,3,4Axis呢,它們對於啥呢? 163 //它們不對應啥,猜測一:這個是SteamVR!,又不是隻給火腿腸vive專用,還有其餘VR設備呢,若是其餘設備手柄軸用的多呢? 164 // 二:Axis2,3,4能對應菜單鍵和手心鍵嗎?no no no , 感覺一下軸和按鈕的區別就明白了,軸通常是範圍值,button是yes or no; 165 166 167 if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis0)) 168 { 169 Debug.Log("觸摸盤"); 170 } 171 if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis1)) 172 { 173 Debug.Log("trigger鍵"); 174 } 175 if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis2)) 176 { 177 178 } 179 if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis3)) 180 { 181 182 } 183 if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis4)) 184 { 185 186 } 187 188 } 189 190 191 //把圓盤劃成4個象限區域按鈕,強行用圓盤變出一些按鈕以防按鈕不夠用! 192 public enum TouchPadButton 193 { 194 Default, 195 UpLeft, 196 UpRight, 197 DowmLeft, 198 DownRight 199 } 200 201 public TouchPadButton GetTouchButton() 202 { 203 TouchPadButton touchButton = TouchPadButton.Default; 204 var device = SteamVR_Controller.Input((int)trackedObject.index); 205 206 if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0)) 207 { 208 209 Vector2 pad = device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad); 210 if (pad.x >= 0 && pad.y >= 0) 211 { 212 touchButton = TouchPadButton.UpRight; 213 } 214 215 if (pad.x >= 0 && pad.y <= 0) 216 { 217 touchButton = TouchPadButton.DownRight; 218 } 219 220 if (pad.x <= 0 && pad.y >= 0) 221 { 222 touchButton = TouchPadButton.UpLeft; 223 } 224 225 if (pad.x <= 0 && pad.y <= 0) 226 { 227 touchButton = TouchPadButton.DowmLeft; 228 } 229 230 } 231 return touchButton; 232 } 233 }
4.手柄圓盤鍵的自定義劃分
將一個觸摸板按照4象限劃分紅4個按鍵
經過座標軸值來劃分
將一個觸摸板按照4象限旋轉45度劃分紅4個按鍵
經過斜率值或角度來劃分插件
5.UI交互
1.插件:Vive Input Utility.unitypackage 導入
2.文檔
3DUI.docxcode
6.瞬移
1.插件:Vive - teleport.unitypackage 導入
2.使用文檔
瞬移.docxhtm