VRTK全称Virtual Reality Toolkit,是基于unity3D设计的一款VR开发插件,包含Prefabs、Scripts、Examples三部分,可实现控制世界指针、控制器按钮事件、物体交互、抓起/握住物体等,实现当下较多的VR界面交互和操作,需要的VR开发人员可以下载!

軟件功能
1)具有別名的控制器按鈕事件
2)控制世界指針(激光指針)
3)玩家瞬間轉移
4)使用控制器抓起/握住物體
5)使用控制器與物體交互
6)把遊戲物体变成交互式的UI元素
使用說明
1:抛物線:跳點傳送。主要控制腳本有VRTK_ControllerEvents事件控制腳本,VRTK_Point選擇是否是可以傳送,而VRTK_BerzierPointRender就是確定是抛物線的方式傳送
2:手柄射線:控制腳本和抛物線的控制腳本相似,但是我們這個是想要手柄射線。所以這裏我們使用VRTK_StraightPointRender,直線渲染。VRTK_ControllerEvents封裝了許多監聽事件,這裏我們可以自己有需要在繼續封裝一程統一調用事件的類。當然這裏我自己加了一些自己需要的事件處理,比如說持續觸摸事件,這些都可以在事件系統裏面添加。這也是VRTK插件運用委托事件完美的地方。讓我更深刻的了解了委托的應用。

3:不管是在什么场景中总有UI的交互。 但是在HTC中,UI就不能像PC或者手游那样去做了,必须把UI改成世界坐标那种形式,因为HTC是全沉浸式设备,注意UI的Canvas需要处理为worldSpace ,需要添加VRTK_UI Canvas,处理UGUI交互必须添加这个组件,这个会在UI上添加一层boxCollider。至于为什么,这个有需要可以看下底层是如何实现的。

4:物品拖动:处理物体拖动的时候需要在物体上添加VRTK_Interactable Object。需要添加boxCollider,如果有需要物理特性,可以添加rigibody钢体组件。
VRTK插件使用教程
DEMO 1 查询硬件手柄头显
在VRTK插件的第一个demo 001_CameraRIg_VR_PlayArea 案例。这个demo 显示的功能: 按下任一手柄上的按键,便载入下一个场景。找到demo场景中##Scene Changer## 遊戲物体,打开附加的scene changer脚本,里面有两个核心的类,以及几个重要的API。
VRTK_DeviceFinder類:用于在場景中尋找左右手柄、頭顯、返回硬件編號或手柄,頭顯的gameobject。

重要的API:
获得左右手柄的遊戲物体
VRTK_DeviceFinder.GetControllerRightHand();
VRTK_DeviceFinder.GetControllerLiftHand();
獲得左右手柄對應的硬件編號
VRTK_DeviceFinder.GetControllerIndex(rightHand)
按下手柄任一按键或键盘上的空格键,加载下一个场景。ForwardPressed 用于侦测手柄的按键是否按下。

上图中引入第二个重要的类:VRTK_SDK_Bridge,这是插件封装了 SteamVR 的比较底层的API:VRTK_SDK_Bridge.IsTriggerPressedOnIndex(controllerIndex) 。输入硬件的编号,返回是否按下的布尔值。
DEMO 2手柄的输入事件
封装成VRTK_ControllerEvent 脚本。针对VR中常见的交互动作: UI点击,抓住物体,触发物体功能等,自定义手柄按键,绑定这些动作。
pointerToggleButton :激光的显示开关,激光在VR里相当于鼠标箭头的指向功能。
pointerSetButton: 激光停留的指向目标,触发目标的功能,相当于鼠标点击。
grabToggleButton :抓住物体动作,配合使用 VRTK 插件集成的抓取,投掷功能。
useToggleButton :触发目标事件,比如把手柄放在门把手上,按下这个按键,触发门打开的功能;手柄放在电灯开关上,按下按键,触发电灯开发的功能。这个和pointerSetButton区别在于后者需要激光落在目标上,才能触发目标上的功能。
uiClickButton :触发UI Canvas 目标的事件。
menuToggleButton :遊戲目录显示开关。
axisFidelity :按键按下的强度,完全按下是1,松开时是0。现在只有Trigger按键(手部后面扳机)有此属性。
triggerClickThreShold :扳机要到多大程度,才能使用扳机的触发功能。如果是0.5,则表示只要按下一半的程度就可以触发,如果是1,则必须完全按下才能触发。
以上是设置各个按键在插件中交互的功能,如果要获得每个按键具体的使用情况,如按下、松开按键、手触摸板的按键位置、扳机的按下强度等,则需要在 VRTK_ControllerEvent 注冊对应按键的事件。
在VRTK_ControllerEvents_ListenerExample腳本中,監聽了VRTK_ControllerEvent所有按鍵的事件,和按鍵的參數信息。如下圖的扳機鍵的按鍵事件。
事件的參數是:手柄的硬件编号、按钮的按下程度值(扳机键专有的属性)、 触摸板的触摸位置和角度(触摸板专有的属性)
DEMO 003_Controller_SimplePointer 传送位置
VRTK_Simple Pointer 类。该脚本继承自VRTK_WorldPointer
功能的核心是將玩家的位置傳送到激光所指落在的地方,該腳本應默認放在手柄的prefab上。其他的參數設置激活顔色、傳送時是否顯示玩家活動區域、激光有效觸碰的層、激光的粗細等。
DEMO 004_CameraRig_BasicTeleport
VRTK_BasicTeleport 。该脚本配合继承自VRTK_WorldPointer的子类,如VRTK_Simple Pointer,添加此脚本后才可以位移传送。
參數
1)傳送時黑屏:模擬眨眼動畫,過渡更自然。
2)黑屏時間:隨傳送距離遠近成正比的黑屏時間。假如傳送的位置比較遠,則黑屏時間更久。數值越大,黑屏時間越長,數值爲0時,不受距離遠近影響。
3)头部位置:以头部为基准,作为传送的位置。未打钩,则是玩家可玩区域的中心位置作为传送的目标点。可玩区域不能和遊戲环境交叉,最大化玩家活动空间。
4)禁止傳送物體的標簽:如果傳送的目標位置的物體標簽和此相同,則不能傳送。
5)作为第四个功能的补充:可以添加 VRTK_TagOrScriptPolicyList 脚本中添加多个禁止传送的物体标签。
6)navemesh 边缘限制:在 navemesh 上传送,如果在 navemesh 的边界,则禁止传送,数值是离边界的距离范围。
DEMO 005_Controller_BasicObjectGrabbing
手柄上添加的組件
抓取物体 VRTK_InteractGrab ,这个脚本用来抓取物体,抓的按键在 VRTK_ControllerEvent 脚本中设置。
controllerAttachPoint :被抓的物体,被附加在哪个物体上,默认是手柄的圆环处。
HideController On Grab :抓住物体时,隐藏手柄。
Hide Controller Delay :延迟几秒后隐藏手柄。
Grab Precognition :提前预判抓取物体。对应快速运动的物体,我们可能需要提早按下抓取按键才能抓住物体,数值是提前的时间值,值越大,可提前的抓取时间越长。
Throw Multiplier :把物体扔出去时,速度的倍增值。
Create Rigid Body When Not Touch :在碰到物体时才创建 RigidBody。默认情况下手柄也创建 Rigidbody,这就可以和物体在物理上碰撞。
和物体接触 VRTK_InteractTouch
Hide Controller On Touch :接触物体时隐藏物体。
Hide Controller Delay :接触物体后延迟几秒后隐藏物体。
Global Touch HighLight Color :如果被接触的物体上未设置接触高亮颜色,则用此颜色来对改变目标的颜色。
Custom RigidBody Object :自定义用于判定接触的刚体物体,如果没有的话,会自动在子层级创建一个刚体物体。
交互物體上應該添加的腳本
VRTK_InteractableObject 需要有rigidbody组件和collider组件
1)Touch options 接触
HighLight OnTouch :接触时高亮显示物体颜色。
Touch HightLight Color :高亮的颜色。
Rumble On Touch :接触时的反馈震动强度和时间。
Allow Touch Controller :规定哪个手柄可以接触这个物体。
Hide Controller On Touch :覆盖是否隐藏手柄的设置,default是根据手柄的设置。
2)Grab Options 抓取
IsGrabbable :是否可以被抓取。
Is droppable :松开时是否掉落。
Is swappable :是否可替换。如果不行,则必须先把物体丢掉。
Hold Button To Grab :按住才能保证物体不掉落。
Grab Override Button :覆盖手柄的抓取按键设置。
Rumble On Touch :接触时震动,同上。
Allowed Grab Controllers: 规定哪个手柄可以接触这个物体。
Precision Grab :精准抓取。如果是,则抓取的位置是刚接触到物体的点,而不是默认的物体中心位置。
Right Left Snap Handle :被抓物体的抓取点,该遊戲物体应该放在被抓物的子层级下。
StayGrabbed On Teleport :传送后仍然抓住物体,否则物体丢掉。
GrabAttach Mechanic :被抓物体的依附机制。Fixed_joint 链接到fixed Joint 上,这是比较常用的物理上的固定位置链接;Spring_joint 和Fixed Joint类似,但是有点手臂关节,可以拉伸弯曲伸直;track Object 不靠joint 链接,而是让被抓物跟随手柄的位置方向;rotator_Track 比较适合门、车驾驶把手这种有固定转轴的物体,它只能在受转轴的约束下,根据手柄的抓取位置来调整旋转;child of controller 作为手柄的子物体;climbable固定不动的交互物体。
3)Use options 使用
Use only if Grabbed :只有在被抓取时才可以被使用。
Hold Button to Use :长按手柄按键才可以使用。
Use Override Button: 自定义操作按键。
Pointer activates Use Action: 如果打钩,当手柄发射的激光落在交互物体上,于此同时如果Holon to use没有打钩,则使用该物体,Holon to use打钩了,则要按住使用按键才可以使用该物体。
该脚本可以 为交互物体增加一个外轮廓颜色。