分类导航
物体的抓取,使用和控制:005,006,008,013,014,021,023,025(Control),026,037,041,043
射线与物体交互:003,019,034
移动:004,007,010,011,012,015,017,020,022,024,027,028,031,033,036,038,042,044
手柄效果:002,016,029,030,032,035,040
这些数字是待会儿要介绍的官方案例的场景序号,未提及的序号就是一些零散的功能。
文章目录
- 001_CameraRig_VRPlayArea
- 002_Controller_Events
- 003_Controller_SimplePointer
- 004_CameraRig_BasicTeleport
- 005_Controller_BasicObjectGrabbing ⭐
- 006_Controller_UsingADoor
- 007_CameraRig_HeightAdjustTeleport
- 008_Controller_UsingAGrabbedObject ⭐
- 009_Controller_BezierPointer ⭐
- 010_CameraRig_TerrainTeleporting
- 011_Camera_HeadSetCollisionFading
- 012_Controller_PointerWithAreaCollision
- 013_Controller_UsingAndGrabbingMultipleObjects ⭐
- 014_Controller_SnappingObjectsOnGrab ⭐
- 015_Controller_TouchpadAxisControl
- 016_Controller_HapticRumble ⭐
- 017_CameraRig_TouchpadWalking ⭐
- 018_CameraRig_FramesPerSecondCounter
- 019_Controller_InteractingWithPointer ⭐
- 020_CameraRig_MeshTeleporting
- 021_Controller_GrabbingObjectsWithJoints ⭐
- 022_Controller_CustomBezierPointer
- 023_Controller_ChildOfControllerOnGrab
- 024_CameraRig_ExcludeTeleportLocations ⭐
- 025_Controls_Overview ⭐
- 026_Controller_ForceHoldObject
- 027_CameraRig_TeleportByModelVillage
- 028_CameraRig_RoomExtender
- 029_Controller_Tooltips
- 030_Controls_RadialTouchpadMenu ⭐
- 031_CameraRig_HeadsetGazePointer
- 032_Controller_CustomControllerModel ⭐
- 033_CameraRig_TeleportingInNavMesh
- 034_Controls_InteractingWithUnityUI ⭐
- 035_Controller_OpacityAndHighlighting
- 036_Controller_CustomCompoundPointer
- 037_CameraRig_ClimbingFalling
- 038_CameraRig_DashTeleport
- 039_CameraRig_AdaptiveQuality
- 040_Controls_PanelMenu
- 041_Controller_ObjectSnappingToDropZones
- 042_CameraRig_MoveInPlace
- 043_Controller_SecondaryControllerActions ⭐
- 044_CameraRig_RestrictedTeleportZones
本文使用的插件版本:VRTK3.3 ,SteamVR 1.2.3
使用的 Unity 版本:2019 LTS 版
我是使用 HTC Vive 进行测试,目前还没有试过和另一款主流头显 Oculus Quest2 进行结合,不过 VRTK 也是支持 Oculus SDK 的。
在 VRTK 3.3 中,VRTK/Examples 目录变成了 7 个场景。官方把以前版本的 44 个案例放到了 VRTK/LegacyEampleFiles 下,在此目录下的 README 文件也有对每个场景的大致介绍(英文)。本文只是简要介绍的VRTK/LegacyEampleFiles 下的 44 个案例场景到底是演示什么东西的。大家如果想要有更深刻的认识,建议真机体验一下,并且结合官方文档进行学习。
官网地址:https://vrtoolkit.readme.io/docs/summary
基本上 VRTK 封装的组件(脚本)挂载到 手柄控制器,可交互的物体, PlayerArea(表示玩家移动的区域) 上比较常见。这些组件中的一些参数说明,以及挂载一个组件之前是否需要添加其他组件才能生效,都在官方文档中有详细的说明。
001_CameraRig_VRPlayArea
演示头部相机。
VRTK_SDK Manager 组件的头显设置。
002_Controller_Events
操作手柄的按键会在控制台上显示相应的信息。(如按下了哪个按键,是按下还是释放之类的)
需添加 VRTK_ControllerEvents 组件到手柄控制器上。
记得在 VRTK_SDK Manager 组件做好手柄设置。
003_Controller_SimplePointer
手柄发射一条直线射线的演示。
VRTK_Pointer 和 VRTK_Straight Pointer Renderer 组件的使用。
记得把 VRTK_Straight Pointer Renderer 拖给 VRTK_Pointer 的 Pointer Renderer 变量。
004_CameraRig_BasicTeleport
手柄使用直线射线传送。
VRTK_BasicTeleport 组件的使用。
005_Controller_BasicObjectGrabbing ⭐
基础的手柄拾取物体的功能,包括变色和边缘发光,左右手柄拾取不同物品,左右手柄交换拾取同一物品。
手柄控制器加上 VRTK_InteractTouch 和 VRTK_InteractGrab。
可交互的物体加上 VRTK_InteractableObject 组件。
注:加了碰撞体的物体才能被抓取。
006_Controller_UsingADoor
按下特定的按键会开门。
VRTK_InteractUse 组件。VRTK_InteractableObject 勾选 IsUsable 作用。
007_CameraRig_HeightAdjustTeleport
带有高度的传送以及忽略某些物体的传送检测功能,还包括头部的物理效果。
HeightAdjustTeleport 组件(区别于 004 的 VRTK_BasicTeleport)VRTK_PolicyList (设置哪些物体不能为传送点)
VRTK_BodyPhysics (挂载到 PlayerArea 上)
008_Controller_UsingAGrabbedObject ⭐
抓取物体后使用物体上面的功能。此场景是抓取枪发射子弹和抓取方块转圈圈。
VRTK_InteractGrab 和 VRTK_InteractUse 组件。
009_Controller_BezierPointer ⭐
贝塞尔曲线的传送功能使用演示。
VRTK_BezierPointerRenderer 组件。(区别于之前的 VRTK_Straight Pointer Renderer)
010_CameraRig_TerrainTeleporting
地形上的传送功能。
011_Camera_HeadSetCollisionFading
展示头盔碰撞到墙体的黑屏效果,表示超出行动范围。
VRTK_HeadsetCollision,VRTK_HeadsetFade,VRTK_HeadsetCollisionFade 组件。
012_Controller_PointerWithAreaCollision
使用传送功能时会出现一个范围提示框。
VRTK_PlayAreaCursor 组件。拖拽给 VRTK_BezierPointerRenderer 组件的 Playerarea Cursor 变量。
013_Controller_UsingAndGrabbingMultipleObjects ⭐
手柄抓取物体和使用物体功能的新方式。
在 InteractGrab 组件中取消勾选:
可实现物体被抓取后松开手柄键仍然不掉落。
014_Controller_SnappingObjectsOnGrab ⭐
抓取物体时的一些细节。
VRTK_FixedJointGrabAttach 组件(添加在可交互的物体上,手柄和可抓取物体之间就会建立一个 Fixed Joint 来连接)。之前的拾取物体案例也有出现,不过此案例进行了更详细的介绍)。勾选了 Presicion Grab 后手柄拾取物体的连接点会是精确的抓取点(在哪个位置抓取就连接在哪个点)。在本案例中如果没有勾选此选项就去拾取枪,即使你是在枪口处拾取枪,最后呈现出来的拾取点还是枪柄的位置。
在 Right/Left Snap Handle 中加入一个空物体可以使被拾取物体的位置和旋转和空物体匹配。
有些物体用了 VRTK_ChildOfControllerGrabAttach 组件,这个放到场景 023 介绍。
VRTK_InteractObjectAppearance 组件加到可交互的物体上能实现抓取物体后隐藏手柄控制器,放下物体后又重新显示。(取消下图中红色方框处的勾选)
015_Controller_TouchpadAxisControl
手柄圆盘上触碰的位置轴向控制小车移动的方向, 按下扳机键能使小车跳跃。
通过监听手柄按键事件,来对小车的刚体施加力。
016_Controller_HapticRumble ⭐
手柄震动。
调用 API (VRTK_ControllerHaptics 类的静态方法):
017_CameraRig_TouchpadWalking ⭐
触摸手柄圆盘控制移动。
VRTK_TouchpadControl 组件:提供可通过改变手柄 Touchpad 上轴的位置(手放在手柄圆盘上的位置)来控制物体的能力。
以下组件如果要生效需提前挂载 VRTK_TouchpadControl 组件(实际上 VRTK_ObjectControl 组件就行,它能够监听虚拟轴的位置变化。因为 VRTK_TouchpadControl 继承自 VRTK_ObjectControl,在本场景中就是监听手柄圆盘上轴的位置变化,也就是手放在圆盘上的位置):
记住要在红色方框处拖入挂载 VRTK_TouchpadControl 组件的物体。蓝色方框处选择监听哪一个方向的轴( X 轴和 Y 轴)。
VRTK_SlideObjectControlAction → 以滑动的方式移动物体,在本场景就是通过触摸手柄圆盘来实现人物平滑移动。
VRTK_WarpObjectControlAction → 这个 warp 不知道怎么翻译比较好,它给人的感受就是通过触摸手柄圆盘向一个方向瞬间传送一小段距离,在视野中会有突然眼前一黑的传送效果。
VRTK_RotateObjectControlAction → 通过触摸手柄圆盘来实现平滑旋转。
VRTK_SnapRotateObjectControlAction →通过触摸手柄圆盘向一个方向瞬间旋转一个角度。
官方案例里给了几个不同的 X,Y 轴组合,大家可以自行进行尝试。
018_CameraRig_FramesPerSecondCounter
显示帧数。
019_Controller_InteractingWithPointer ⭐
使用射线与物体交互。
在 VRTK_InteractableObject 组件上勾选此选项(红框为必选):
默认情况下触摸到物体时按下手柄扳机键会和物体进行交互(在手柄控制器上也要加上 VRTK_InteractUse),然后勾选以上选项后射线射到物体上时也会触发“使用”功能,效果与触摸到物体时按下手柄扳机键是一样的。
020_CameraRig_MeshTeleporting
网格碰撞的传送效果。
021_Controller_GrabbingObjectsWithJoints ⭐
使用不同关节抓取,本案例演示了不同的抓取机制。每种机制的具体介绍可参考官方文档。
比如 FixedJoint 适合抓取 Cube, SpringJoint 适合抓取抽屉,RotatorTrack 适合抓取门。
022_Controller_CustomBezierPointer
给传送时的贝塞尔曲线加上特效。
在 VRTK_BezierPointerRenderer 组件进行设置。
023_Controller_ChildOfControllerOnGrab
子物体的抓取功能。演示了一个射箭场景。
可交互的物体添加了 VRTK_ChildOfControllerGrabAttach 组件后,当用于抓取的物体(此场景中是玩家的手柄控制器,也就是玩家的手)拾取了可交互物品时,该物品会成为用于抓取的物体的子物体,也就是手柄的子物体,使得物体自然地跟随手柄移动和旋转。
024_CameraRig_ExcludeTeleportLocations ⭐
排除不可传送的物体,在 PlayerArea 上加个 VRTK_PolicyList 组件进行设置。本场景使用 tag 和 scripts(物体挂有指定名字的脚本) 进行排除。
025_Controls_Overview ⭐
控制功能,包括 Pusher,Rotator,Slider
具体功能可参考官方文档。
026_Controller_ForceHoldObject
程序一开始运行双手就持有剑,并且不会掉落。
在手柄控制器上添加 VRTK_ObjectAutoGrab 组件。(使用前必须先在同一个物体上添加 VRTK_InteractTouch 和 VRTK_InteractGrab 组件)
027_CameraRig_TeleportByModelVillage
使用触摸模型的方式进行固定点的传送。
具体代码逻辑在这个脚本中:
028_CameraRig_RoomExtender
比较空旷的场景。玩家可以在现实世界允许的范围内多走几步到达虚拟世界中的某个地点。
029_Controller_Tooltips
手柄上的按钮提示 UI
将 ControllerTooltips 预制体作为控制器的子物体。
030_Controls_RadialTouchpadMenu ⭐
手柄圆盘上面的虚拟按钮菜单。
将 RadialMenu 预制体作为某个物体的子物体。
031_CameraRig_HeadsetGazePointer
使用头盔发射射线的传送功能。
HeadsetFollower 挂有 VRTK_SDKObjectAlias 组件,可以使该物体成为被选中的 SDK Object 的子物体。
选择 Headset,代表了玩家的头部摄像机。这样在程序运行时 HeadsetFollower 物体就会成为玩家头部相机的子物体。
HeadSet 挂有 VRTK_TransformFollow 组件可以使 Headset 的 Transform 跟随 HeadsetFollower 的 Transform,另外射线相关的组件也挂在这个物体而不是手柄控制器上。这样 Headset 物体相当于在我们的头盔上,可根据头部的视线来帮助传送。
032_Controller_CustomControllerModel ⭐
替换手柄的模型的案例。
将 VRTK_BasicHand 作为手柄控制器的子物体。
在 VRTK_InteractTouch 组件添加自定义的手部碰撞器。
033_CameraRig_TeleportingInNavMesh
在寻路网格上的传送功能。
VRTK_NavMeshData 组件。
034_Controls_InteractingWithUnityUI ⭐
和 Unity UGUI的交互。包括使用手柄发射射线和使用头盔发射射线进行交互。
在可交互的 UI 上添加 VRTK_UICanvas 组件。
在可与 UI 交互的物体(手柄,头盔)上添加 VRTK_UI Pointer 组件。
注:这个场景里额外添加了一个EventSystem,所以能和按钮之类的控件进行交互。(原来有个 EventSystem 在 SDKSetupSwitcher 的子物体中,但运行时默认是隐藏的。如果我们自己创建的VR场景并且想要用到射线与 UGUI 的交互,在创建 UGUI 时 编辑器不会自动为我们创建 EventSystem,我们需手动创建一个)
035_Controller_OpacityAndHighlighting
手柄接触物体时手柄的高亮效果。
VRTK_ControllerHighlighter 组件。
036_Controller_CustomCompoundPointer
贝塞尔曲线的另一种特效。
037_CameraRig_ClimbingFalling
使用手柄攀爬功能展示。
VRTK_ClimbableGrabAttach 组件。
并且拖给到 VRTK_InteractableObject 的 Grab Attach Mechanic Script 变量。
注:攀爬时的抓取点不能加 Rigidbody 组件。
038_CameraRig_DashTeleport
前冲传送,将传送点冲刺过去而不是瞬移。
039_CameraRig_AdaptiveQuality
头盔内显示FPS和质量效果提示。
040_Controls_PanelMenu
面板 UI 菜单交互。
VRTK_PanelMenuController 和 VRTK_PanelMenuItemController 组件的使用。一般是按下手柄圆盘某个位置(top,bottom,left,right)能够打开 UI 面板。
041_Controller_ObjectSnappingToDropZones
可预先设置一个区域,指定我们持有的某类物体在接近这个区域范围时,该区域会出现一个此类物体的形状,提示你可以将这类物体放置在这个区域,并且我们还能设置物体放置在此区域的位置,旋转和缩放。然后当我们松开手持的这个物体时,该物体就会一下子固定到我们设置好的那个区域。(建议自己去体验一下这个场景就知道 SnapDropZone 是什么意思啦)
Unity 官方的英文解释:A Snap Zone (or “Snap Drop Zone”) is a designated area where you can place an object near it, illuminating a shape to indicate you can place it there. Upon releasing the held object, it will “snap” into place.
VRTK_SnapDropZone 组件的使用。
042_CameraRig_MoveInPlace
模拟行走,按下手柄圆盘,在现实世界中移动时,人物在虚拟场景中也会移动(应该是通过摇摆手柄模拟人在现实中摆臂行走奔跑)
VRTK_MoveInPlace 组件的使用。
043_Controller_SecondaryControllerActions ⭐
两个手柄可以同时操作一个物体。
之前的场景是用 VRTK_SwapControllerGrabAction 组件实现双手交换拾取物品。此场景可实现双手一起操作一个物体。
VRTK_AxisScaleGrabAction 组件:当物体被另一个手柄抓取时,能够控制物体地缩放。
VRTK_ControlDirectionGrabAction 组件:当物体被另一个手柄抓取时,能控制物体地旋转方向。
044_CameraRig_RestrictedTeleportZones
设置指定的传送点。
VRTK_DestinationPoint 组件的使用。
PlayerArea 中的 VRTK_PolicyList 组件要做好设置。