一、VRTK 环境搭建
前提:首先需要从商店导入 SteamVR(V1.2.2 版)以及 VRTK(V3.2.1 版)
① 新建一个空物体改名为[VRTK_SDKManager],并且添加脚本VRTK_SDKManager
② 新建一个空物体改名为[VRTK_SDKSetup],并且添加脚本 VRTK_SDKSetup
③ 将 SteamVR 中的[CameraRig]拖到[VRTK_SDKSetup]下做其子物体
④ 选择脚本 VRTK_SDKSetup 的 Quick Select 为 SteamVR,如下所示:
⑤ 点击脚本 VRTK_SDKManager 的“Auto Populate”,如下所示:
⑥ 给[VRTK_SDKManager]新建三个空物体,并改名为 LeftController、RightController、PlayerArea,首先给 LeftController、RightController 添加基础交互脚本(如下图 1 所示),然后在给 PlayerArea 添加瞬移脚本(如下图 2 所示):
⑦ 如果需要给左右手柄按钮添加提示信息,则将VRTKàPrefabsàControllerTooltips 拖入到 LeftController、
RightController 下,如下图 1、图 2 所示:
⑧ 再将 LeftController、RightController 拖入脚本 VRTK_SDKManager
二、手柄发射射线使人物位移
首先要在PlayerArea上添加脚本VRTK_Basic Teleport,这个脚本是控制人物位移的基础脚本。
然后我们需要在左手柄控制器上画射线,VR中由于没有直接控制人物移动的方法,一般情况下都是通过射线指向地面的不同地方,使人物通过瞬移到射线射到地面的点来进行移动。
对物体添加VRTK_ControllerEvents脚本,这个脚本是监听手柄的按键。
添加VRTK_Bezier Pointer Renderer脚本,这是画曲线射线的脚本,一般通过曲线射线在地上的接触点来确定人物移动的位置,而VRTK_Straight Pointer Renderer脚本是画直线射线的脚本,也可以用来确定人物位移的位置,不过通常把直线射线用来进行交互事件,而用曲线来进行位移。
添加VRTK_Pointer脚本,这个脚本可以让手柄发射射线,通过与前一个画射线的脚本进行结合来实现手柄发射射线功能。
需要注意的是Enable Teleport这个属性一定要勾选上,否则无法进行射线瞬移功能。Pointer Randerer要选择一种射线,否则就无法看到手柄发射的射线,而Pointer Interaction Settings的两项属性是控制抓取功能的,尤其是Grab To Pointer Tip这属性可以精确到点的抓取。
通过以上的脚本就能确定人物的瞬移功能。按着手柄Touchpad键,手柄会发射一条抛物曲线到地面上,松开按键,人物就能瞬移到目标点。
三、手柄对物体的抓取
通过前边对手柄实现瞬移功能的理解,我们知道了使用手柄的基本操作,就是通过VRTK__ControllerEvents脚本监听按键事件,通过VRTK_Straight Pointer Renderer和VRTK_Pointer两个脚本画出直线射线进行相关的交互功能。
添加VRTK_Interact Grab,VRTK_Interact Touch,VRTK_Interact Use,VRTK_Interact Use_Unity Events等脚本使手柄有抓取功能 。其中的Touch脚本是当手柄接触物体是才能触发。
需要注意的是脚本中的Controller Events属性要添加需要监听的手柄,在Use的Events中添加手柄,选择VRTK_InteractGrab.AttemptGrab方法,这样手柄的抓取功能基本就设置好了,然后在对需要抓取的物品进行设置就能实现手柄抓取物品的功能。
被抓取的物体Cube方块需要添加VRTK_Interactable Object脚本,从而确定手柄的事件能够监听到Cube上。
其中脚本中的Is Grabbable是确定物体能否被抓取,Stay Grabbed On Tele是确定瞬移的时候还能保持抓取物体的状态。而Grab Attach Mechanic和Secondary Grab Action两个属性是通过添加VRTK_Child Of Controller Grab Attach和VRTK_Swap Controller Grab Action两个脚本进行添加的。脚本添加完以后,要想让物体被抓取还有一个重要的地方,就是让物体有碰撞和刚体,否则还是无法进行物体的抓取。
通过按着手柄的Touchpad键,手柄发射一条直射线,当射线射到Cube上,按着Trigger键就能通过射线把Cube抓起来,当手柄接触Cube时,按着Grip可以把Cube直接抓到手柄上,也能实现抓取功能。