暂时VRTK还无法兼容Steam VR 2.X的版本,因此暂时放弃VRTK,先了解一下SteamVR 2.X如何使用
首先还是完成一个最简单的功能,按Trigger键打印一些东西,并引申到其他按键
对“新版”SteamVR input这个输入系统不太了解的朋友,可以先看看这篇文章
https://blog.csdn.net/lizhenxiqnmlgb/article/details/88566505
简单来说,出这个新版系统就是为了,一次开发,多硬件使用。因为不同硬件的物理按钮等各不相同,例如HTC vive和Oculus的手柄等按键都各不相同。有了新版输入系统,开发者不再需要区别按键是vive的Trigger还是Oculus的Grab,我们只需要在输入系统定义一个事件,类似开火Shoot,然后我们在开发过程中针对Shoot进行开发,后期和不同设备对接,只需要针对shoot对手柄按键进行映射即可。
目前官方为触控事件定义了如下几个类型
输入事件:
布尔就是一些按键,按钮的类型,类似Trigger
vec1,可以模拟一些按键的键程,类似你Trigger,勾了多少
vec2,触控板的二维信息
vec3,
pose
skeleton,关节信息,类似为了精确的手部模型,精确的抓握物体时用的
输出事件:
目前只有一种,就是震动
我使用的是Htc vive
那么开始代码,我使用的unity版本2019.4.2, SteamVR 2.5.0
打开Windows-SteamVR Input窗口
测试使用default-InteractUI (因为和UI交互的按键,一般都会绑定Trigger)
新建场景,将[CameraRig]和[SteamVR]拖到场景中,并删除原相机
左右手柄依然在CameraRig下
每个手柄上都默认挂载着SteamVR_Behaviour_Pose脚本
下面我们新建一个脚本InputTest01.cs,挂载到场景任意物体上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
public class InputTest01 : MonoBehaviour
{
public SteamVR_Action_Boolean action = SteamVR_Input.GetAction("InteractUI");
public SteamVR_Behaviour_Pose pose;
// Update is called once per frame
void Update()
{
if (action.GetStateDown(pose.inputSource)) {
Debug.Log("ButtonDown");
}
if (action.GetStateUp(pose.inputSource)) {
Debug.Log("ButtonUp");
}
if (action.GetState(pose.inputSource)) {
Debug.Log("Button");
}
//if (action.GetLastStateDown(pose.inputSource)) {
// Debug.Log("ButtonDownLater");
//}
}
}
为Pose赋值,这里要使用哪个手柄的按键,就将哪个手柄赋值给pose即可
运行结果
布尔型的交互事件,一共有三种监听(其实是六种),类似原Input系统的Button,ButtonDown和ButtonUp事件。
而另一种GetLastStateDown(也是对应三种),会在原事件执行后执行。
GetStateDown和GetLastStateDown,会先执行GetStateDown事件然后执行GetLastStateDown
下面我们创建一个自定义事件,remoter(遥控器),采用Vector2类型的,来获取手指放在touch Pad的二维坐标
在SteamVR input中添加remoter如下图
然后点击右下角按钮Open binding UI
点击编辑
可以看见,窗口中已经提示有按键未绑定
我们在左侧选择触控板,点击“位置”,为其赋值为我们创建的remoter(“an remoter”就是我们在unity中添加的描述)
绑定完成后,回到Unity
在脚本中添加如下代码
首先获取到我们刚刚写的remoter
public SteamVR_Action_Vector2 remoter = SteamVR_Input.GetAction("remoter");
然后在Update中打印内容
//只要手放在触控板上,即可触发
if (remoter.GetChanged(pose.inputSource)) {
//获取手指在触控板的坐标位置
Debug.Log("Axis=" + remoter.GetAxis(pose.inputSource)+ " || Axis Delta=" + remoter.GetAxisDelta(pose.inputSource));
}
运行时,手触摸触控板(注意,你的pose拖拽的哪个手柄,哪个手柄的触控板才可触发),可以看到打印结果