这是基于SteamVR基础之上的一款插件,再获得硬件设备上比之前单独使用steamVR方便很多。
比如,之前我们获得硬件设备是这样的:首先写一个如下图的脚本,挂在CameraRig的手柄上(看需要那个手柄上的按键)
但是,在这里,我们来介绍HTC.Unity.Plugin插件的用法
首先我们进行场景和环境的搭建
再Store当中找到HTC.Unity.Plugin插件,并且导入,之后再ViveInputUtility中找到Prefabs文件夹,把ViveCameraRig和[ViveInputUtility]放入场景中。整个场景之只需要ViveCameraRig一个camera就可以。然后我们试着再去实现上述功能。
首先建立脚本,如下:
在脚本中我们需要引入相应的命名空间:Using HTC.UnityPlugin.Vive;然后我们通过ViveInput类就可以调用之前我们的总总方法,如图所示。
我们模拟扣动扳机键,让obj进行两个position的位置的切换过程代码
public class SteamGetVive01 : MonoBehaviour {
bool isTrigger = false;
public GameObject obj;
void Update () {
//如果扣动扳机键,obj的position变为new Vector3(0,2,0);
//再次扣动扳机键,obj的position变为new Vector3(0,0,0);
if(ViveInput.GetPressDown(HandRole.LeftHand, ControllerButton.Trigger) && !isTrigger)
{
obj.transform.position = new Vector3(0, 2, 0);
isTrigger = true;
} else if (ViveInput.GetPressDown(HandRole.LeftHand, ControllerButton.Trigger) && isTrigger)
{
isTrigger = false;
obj.transform.position = new Vector3(0, 0, 0);
}
}
}
下面我对于这个HTC.UnityPlugin插件的其他功能进行探索,我准备用两天时间写一篇比较系统的教程,之前使用过VRTK,但是和HTC.UnityPlugin确实比VRTK在某些功能的实现上好用很多。同时也会回顾一下硬件设备的知识以及以前的一些关于编程代码方面的知识。
首先看一下手柄,也就是我们进行交互的载体。
menu按键:默认用来打开游戏菜单
Grip按键:每个手柄上都有两个,在侧面都是相同的,而且用的很少。
Trigger按键:扳机键,我们用的最多,经常用来实现抓取和配合UI进行选择功能,也可以有返回值。
Pad按键:可以用来触摸(返回数值)、可用来点击。
正式开始程序开发篇
首先,引入HTC.UnityPlugin.Vive框架
每个按钮(哪怕是TouchPad)都有GetPress、GetPressDown、GetPressUp三种方法,用HandRole枚举来确定左右手柄,用ControllerButton枚举来确定是哪个按钮。GetPress是按住时一直返回true,如同我们的按键时一样的,表示一直按住,返回的也是一个状态。
其实,我们用手柄,也就是为了触发一些跟手柄操作相关的事件。也就是通过回掉的方式进行实现
同时Trigger按钮除了可以触发按下和松开之外,Trigger可以有返回值。其中Trigger的返回值是从0到1的改变,当没有按动时其值表示0,当全部按下的时候其值表示1。
Trigger按钮对应有三种:Trigger,HairTrigger,FullTrigger。
HairTrigger表示TriggerValue的值在0.1到0.2 (轻按)
Trigger表示TriggerValue的值超过0.5 (中度按)
FullTrigger表示TriggerValue的值是1 (全按)
同样的Pad除了可以按下触摸等行为触发事件外,还可以返回一些值
ViveInput.GetPadAxis和ViveInput.GetPadTouchAxis输出的值是一样的
TouchPad有触摸和按下两组方法,
Axis是坐标位置
Delta是最后一帧移动位置
Vector是移动的向量
ViveInput.GetPadTouchAxis(HandRole.LeftHand,false)
ViveInput.GetPadTouchDelta(HandRole.LeftHand,false)
ViveInput.GetPadTouchVector(HandRole.LeftHand,false)
ViveInput.GetPadPressAxis(HandRole.LeftHand,false);
ViveInput.GetPadPressDelta(HandRole.LeftHand,false);
ViveInput.GetPadPressVector(HandRole.LeftHand,false);
Vive.Input Utility当中UI的交互
首先我们需要进行环境的搭建:场景当中需要把[CameraRig]以及VivePointers拖入到场景中,我感觉最好是把VivePointers设置成[CameraRig]的子物体,localTransform都归置为0
新建一个Button,然后把EventSystem组建删除掉,然后把Canvas的Render Mode改为World Space模式、调整Button的大小以及Canvas的大小。然后给Canvas添加上Canvas Raycast Target组建。
当运行之后,手柄会发出射线,当射线照射到按钮,就会出现一个黄色的球,这时候按下Trigger就可以实现点击按钮的动作了。
Vive.Input Utility当中手柄和物体的交互
当运行实现的功能:手柄射线照射到3D物体的时候,可以通过Trigger按钮抓住物体并且拖动
环境的搭建:预制体[CameraRig]和VivePointers的拖入场景当中 创建一个Cube
然后给Cube添加Dragger组建,在添加Dragger组建的同时,然后添加Rigidbody组建,根据实际需要看是否勾选重力。
Vive.Input Utility中使用手柄进行瞬移功能的实现
实现功能:当按下Pad键的时候,Player会被传送到抛物线和物体交汇处,从而实现远距离移动。
新建一个空物体,命名为 VR Origin,然后把[CameraRig]拖入,并且设置成VR Origin的子物体。
然后把预制体VivePointers同样拖入到场景中,成为VR Origin的子物体
设置可瞬移区域:
然后新建一个空物体游戏对象,命名为Ground,把一些可瞬移的区域或者物体拖入,只要你想发生瞬移的物体都可以拖入,比如胶囊体,正方体、Plane等都可以成为这样的瞬移区域。然后再给这些物体的父物体Ground添加Teleportable脚本组建。
设置父物体Ground添加Teleportable脚本的属性,这些属性,如果你按照上面的步骤来,当你添加脚本的时候就会自动设置好。如图所示:
之后再VivePointers组建的EventRaycaster上添加脚本Projectile Generator,然后修改Velocity的数值就可以进行瞬移。如上面的步骤中,我们不但添加了立方体等,还添加了Plane,这样瞬移功能基本可以实现。至于一些个性化的设置,需要诸多尝试和说明,我在这里就不再一一赘述。
运行之后,效果:
Vive.Input Utility中使用手柄
首先新建场景
然后给需要抓取的物体添加组建Basic Grabbale
就可以实现物体的抓取。