一、关于左右手柄的对应关系
- 两个手柄和SteamVR_TrackedObject.EIndex是对应的,一个是EIndex.Device2,另一个是EIndex.Device3(有编号的那个)
- 在场景中手柄先后连入,先后激活的是Controller(right)、Controller(left),并添加SteamVR_TrackedObject组件
二、手柄按键
![](https://i-blog.csdnimg.cn/blog_migrate/272016445cd2657ccbb138772e67fe63.png)
1 - 菜单键
6 - 系统键(按下后手柄断开连接,再次按下手柄再次连接上)
7 - 扳机键
8 - 握持键
9 - 触摸板键
(1)点按
按键监听方式一:(SteamVR的方式,封装了OpenVR)
通过Device.GetPressDown / GetPressUp / GetPress获取按键事件
![](https://i-blog.csdnimg.cn/blog_migrate/9ba283922fab34691d45d35b8ac5c60f.png)
按键监听方式二:(OpenVR的方式,偏底层)
通过controllerState.ulButtonPressed & (SteamVR_Controller.ButtonMask.Trigger)获取按键的按下、松开两种状态
![](http://img.manew.com/data/attachment/forum/201606/21/130325o0sjsj6hjzj7hv0i.png.thumb.jpg)
或者:
![](https://i-blog.csdnimg.cn/blog_migrate/75466c16c6ac8b9443fda6d90a38df72.png)
注:m_State、m_PrevState分别表示:当前帧状态、前一帧状态
获取按下时,触摸板的值
![](https://i-blog.csdnimg.cn/blog_migrate/9588ed48a5e1615b99da2e308b63fe3e.png)
获取松开时,触摸板的值(这里必须使用前一帧的状态,因为松开时,当前帧的触摸的值为0)
![](https://i-blog.csdnimg.cn/blog_migrate/28ca9e7b0f36c024956e1cbc5ab5b5d6.png)
猜测原因:获取值的Update方法在更新状态Update的方法之前执行了,更新状态的Update方法执行后,才能获取触摸板的值
解决方法:如果不想修改脚本执行顺序的话,可以使用LateUpdate
(2)触摸
- 适用于触摸板键
- 适用于扳机键(和点按类似,只是键程更短)
![](https://i-blog.csdnimg.cn/blog_migrate/aee7b821369c57eb11963810500fbdf1.png)
方式二:
![](https://i-blog.csdnimg.cn/blog_migrate/b34f04538876941784eb5f6cb2d3b75c.png)
问题:触摸按下时,没有获取到当前帧触摸板的值!
原因:不明,内部机制需要搞清楚
解决办法:在触摸按下后的第二帧才获取到触摸板的值。
![](https://i-blog.csdnimg.cn/blog_migrate/ae5709cb84e2f9eff38215e888c17d04.png)
(3)触摸板轴的获取
通过以上两种方式获取的VRControllerState_t,获取触摸板的轴
x = state.rAxis0.x
y = state.rAxis0.y