HTCVive的手柄的功能键调用

时间:2021-10-13 14:59:26

Vive手柄按键的交互操作对于VR的体验来说很重要,所以这次我们来说一下手柄上的按键是怎么做交互的。

首先我们需要新建脚本,然后把这个脚本拖到左手或者右手的控制器上,表明我们要给哪个控制器使用这个脚本。

 HTCVive的手柄的功能键调用HTCVive的手柄的功能键调用

在使用功能键之前,先需要追踪到手柄,添加下面代码:

 

SteamVR_TrackedObject trackedObj;
void Start ()
{
trackedObj = this.GetComponent<SteamVR_TrackedObject>();

}

接下来要获得有输入的手柄的Index(两个手柄在运行的时候Index不同),这里通过寻找不同的Index来找到相应的手柄,在Update中添加下面代码:

void Update ()
{
SteamVR_Controller.Device device = SteamVR_Controller.Input((int)trackedObj.index);
}

这样便能获取到输入是哪一个手柄了。

接下来我们看看按键的开发:

1.扳机键Trigger

游戏中的大部分交互都是通过扳机键触发的,他在体验中起者很关键的作用。

获得扳机键的输入需要在Update中写入下面代码:

if (device.GetHairTriggerDown())
{
//扣下扳机时的操作
}

if (device.GetHairTrigger())
{
//扣住扳机时的操作
}

if (device.GetHairTriggerUp())
{
//放开扳机键时操作
}

或者还可利用

if (device.GetTouchDown(Valve.VR.EVRButtonId.k_EButton_Axis1))
{
//扣下扳机时的操作
}

if (device.GetTouch(Valve.VR.EVRButtonId.k_EButton_Axis1))
{
//扣住扳机时的操作
}

if (device.GetTouchUp(Valve.VR.EVRButtonId.k_EButton_Axis1))
{
//放开扳机时的操作
}

来进行扳机键的交互,

还有一种是

 

	if (device.GetPressDown(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger))
{
//扣下扳机时的操作
}

if (device.GetPress(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger))
{
//扣住扳机时的操作
}

if (device.GetPressUp(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger))
{
//放开扳机时的操作
}

也可以对扳机键进行调用。

 

总结一下扳机键的调用方式,一共有三种不同的方式:

device.GetHairTrigger(); 轻轻扣动扳机便会调用

device.GetTouch(Valve.VR.EVRButtonId.k_EButton_Axis1); 检测一次完整的输入才会调

device.GetPress(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger);扳机键必须扣到底才会调

 

2.触摸板Touchpad

(1).按下功能,有两种调用方法:

if (device.GetTouch(Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad))
{
//按住Touchpad时的操作
}

//还有一种if (device.GetPress(Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad))        {            //按住Touchpad时的操作 }

一样每种方法都有Down,按住和Up三种,只不过GetTouch是在运行时轻轻点击即可触发,而GetPress需要触摸板完全按下才可触发。

 

(2).滑动功能:触摸板的比较重要的功能就是滑动功能,需要在Update中添加下面代码:

Vector2 FingerPosition = device.GetAxis(Valve.VR.EVRButtonId.k_EButton_Axis0);

这样便获得了手指在触摸板上的位置,触摸板中心是(0,0),手指在触摸板上的X和Y轴的偏移量都是-1到+1,也就是这个二维向量的范围是(-1,-1)到(1,1)。这样我们便知道了手指在触摸板上的偏移量,就可以在游戏中做一些应用了。


3.功能键ApplicationMenu:

这个功能键是在触摸板上面,一般用来弹出游戏菜单的:

  if (device.GetPressDown(Valve.VR.EVRButtonId.k_EButton_ApplicationMenu))
{
//操作
}

一般点一次就能相应的,就用Down函数执行。


4.手柄震动TriggerHapticPulse:

交互的时候都会使手柄震动来有一个反馈的效果:

device.TriggerHapticPulse(500,Valve.VR.EVRButtonId.k_EButton_Axis0);
这个就是控制手柄震动的函数,该函数有两个参数,第一个是振动幅度的大小(1~3999),第二个是相关震动区域:触摸板和全手柄,如果不写第二个参数则为默认全手柄震动。

 

5.左右侧键Grip

 

 if (device.GetPress(Valve.VR.EVRButtonId.k_EButton_Grip))
{
//按住侧键的操作
}

if (device.GetPressDown(Valve.VR.EVRButtonId.k_EButton_Dashboard_Back))
{
//按下侧键的操作
}

本文内容部分参考自Think加速想象力出版的ARVR开发实战》教程,更多学习资料也请关注www.arvrthink.com