【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容

暂时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对手柄按键进行映射即可。

目前官方为触控事件定义了如下几个类型

输入事件:

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第1张图片

布尔就是一些按键,按钮的类型,类似Trigger

vec1,可以模拟一些按键的键程,类似你Trigger,勾了多少

vec2,触控板的二维信息

vec3,

pose

skeleton,关节信息,类似为了精确的手部模型,精确的抓握物体时用的

输出事件:

目前只有一种,就是震动

 

 

我使用的是Htc vive

那么开始代码,我使用的unity版本2019.4.2,  SteamVR 2.5.0

 

打开Windows-SteamVR Input窗口

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第2张图片

测试使用default-InteractUI (因为和UI交互的按键,一般都会绑定Trigger)

 

新建场景,将[CameraRig]和[SteamVR]拖到场景中,并删除原相机

左右手柄依然在CameraRig下

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第3张图片

每个手柄上都默认挂载着SteamVR_Behaviour_Pose脚本

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第4张图片

 

下面我们新建一个脚本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即可

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第5张图片

运行结果

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第6张图片

 

布尔型的交互事件,一共有三种监听(其实是六种),类似原Input系统的Button,ButtonDown和ButtonUp事件。

而另一种GetLastStateDown(也是对应三种),会在原事件执行后执行。

GetStateDown和GetLastStateDown,会先执行GetStateDown事件然后执行GetLastStateDown

 

下面我们创建一个自定义事件,remoter(遥控器),采用Vector2类型的,来获取手指放在touch Pad的二维坐标

在SteamVR input中添加remoter如下图

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第7张图片

 

然后点击右下角按钮Open binding UI

点击编辑

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第8张图片

可以看见,窗口中已经提示有按键未绑定

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第9张图片

我们在左侧选择触控板,点击“位置”,为其赋值为我们创建的remoter(“an remoter”就是我们在unity中添加的描述)

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第10张图片

绑定完成后,回到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拖拽的哪个手柄,哪个手柄的触控板才可触发),可以看到打印结果

【Steam VR 2.0】1.(Steam VR Input) SteamVR 2.0 新版输入系统的使用 手柄按键打印内容_第11张图片

 

你可能感兴趣的:(Unity,VR)