上一个章节的链接:Unity开发VR——结合VRTK(一)
这一章节,继续利用VRTK开发VR
该章节介绍了使用VRTK来开发基础的VR功能
手柄射线
射线的发出
1.首先,需要在手柄“LeftController”或“RightController”下添加三个组件(对应的左手柄还是右手柄发射线),分别是:VRTK_Pointer、VRTK_Straight Pointer Renderer、VRTK_Controller Events
VRTK_Pointer:基于指针的手柄射线
VRTK_Straight Pointer Renderer:渲染手柄指针
VRTK_Controller Events:手柄按键激活的事件,是所有交互的基础
2.为指针添加渲染,在VRTK_Pointer组件下的Pointer Renderer,添加刚刚指定的VRTK_Straight Pointer Renderer组件
3.运行场景,手柄按下圆盘,即可看到射线的发出
瞬移
(一)瞬移的初步实现
1.在射线发出的基础上,添加瞬移功能。在VRTK_Script下新建空物体PlayerArea,该物体用来添加玩家的一些属性
2.在该物体上添加“VRTK_Basic Teleport”
组件,这是最传统的瞬移方法
Blink To Color:瞬移时的瞬间变化颜色
Blink Transition Speed:瞬移时闪屏效果的持续时间
Distance Blink Delay:瞬移时闪屏的延时
HeadsetPositionCompensation:关于瞬移后的位置问题,默认勾选
Target List Policy:瞬移时的策略设置,涉及VRTK_Policy List这个类,后面会说
Nav Mesh Limit Distance:使用Nav Mesh控制瞬移区域的数值
3.有了这些配置,场景瞬移的功能是实现了。但最重要的一点就是,场景中的地面必须添加碰撞体
,不然使用不了瞬移功能
(二)瞬移机制
1.最基本的瞬移机制:“VRTK_Basic Teleport”
使用方法:上文有介绍
2.带高度自适应的瞬移机制:“VRTK_HeightAdjustTeleport”
作用:防止瞬移到物体中间(穿透在里面) ,可用于上下楼梯或瞬移到地势高的地方
使用方法:在PlayerArea移除其他瞬移机制组件,添加“VRTK_HeightAdjustTeleport”高度自适应组件。
该组件和“VRTK_Basic Teleport”组件的区别是多了一组HeightAdjustSettings的高度自适应属性
- Snap To Nearest Floor:如果勾选了这个选项,那么传送的Y位置将会与楼层下面最近的可用位置对齐,如果不勾选了这个选项,那么传送的Y位置将会在目的地Y位置的任何地方。
- Layers To Ignore:需要忽略掉的瞬移层级
3.两点之间快速移动并带高度自适应的瞬移机制:“VRTK_DashTeleport”
使用方法:在PlayerArea移除其他瞬移机制组件,添加“VRTK_DashTeleport”组件。
(三)瞬移限制
1.根据VRTK_Policy List组件限制瞬移区域
①在PlayerArea身上挂载VRTK_Policy List组件,并添加到相应的瞬移机制上的“Target List Policy”属性上。
②VRTK_Policy List组件属性介绍
Operation:选择是忽略掉还是包含在内的
CheckTypes:检查某一种类型,一般是Tag或者Layer
Size: 数量,可存在多个
Element:输入名称,例如类型是tag,则输入tag的名称
2.根据Navigation导航限制瞬移区域
Nav Mesh Limit Distance属性,是与场景导航的设置有关。先场景烘焙导航Navigation,Bake一下获取到可导航的区域。前提是可导航的物体要设置为Navigation Static
然后Nav Mesh Limit Distance属性的值意思是 导航边界往里缩多少米都可以实现瞬移。
3.根据传送点限制瞬移区域
利用VRTK_Destination Point脚本,可参考传送点预制体DestinationPoint
传送点预制体身上有defaultCursor、hoverCursor、lockedCursor
,分别对应VRTK_Destination Point脚本里的三个属性DefaultCursorObject、HoverCursorObject、LockedCursorObject
。
.
DefaultCursorObject:传送点默认(可传送)的状态
HoverCursorObject:传送点被指向的状态
LockedCursorObject:传送点被锁定(不可传送)的状态
扩展:也可将传送点修改为传送区域,记得需要添加碰撞体
(四)瞬移的三种方法
1.直线
可往上查看 瞬移的初步实现 的方法
2.贝塞尔曲线
①贝塞尔曲线是经常需要用到的,实现的方法VRTK已经写好了。以下是配置步骤:
在手柄控制器物体身上挂载VRTK_BezierPointerRenderer
组件,并且在VRTK_Pointer
组件中的PointerRenderer属性上添加进去
这样就可以实现贝塞尔曲线的瞬移。
②要使指针末端始终与指到的物体表面垂直,即避免在不规则的地面上指针有穿透问题,需要勾选上Cursor Match Target Rotation
3.触摸板滑动行走
使用触摸板代替射线行走,操作步骤:
①手柄控制器下添加空物体,这里命名为TouchpadControlOptions
②在TouchpadControlOptions物体身上挂载两个组件VRTK_Slide Object Control Action
③两个组件的属性栏Listen On Axis Change分别设置为监听X与Y轴
④在手柄控制器Left/Right Controller上添加VRTK_Touchpad Control
⑤将ObjectControlScript属性赋值当前所在的手柄控制器Left/Right Controller
(五)自定义瞬移指针
下面以贝塞尔曲线为例:
Cursor:指针与碰撞体交界的光标
Tracer:构成曲线的元素,默认是几个小球形成点状曲线
- Valid Collision Color:可使用时显示的颜色
- Invalid Collision Color:不可使用时显示的颜色
- Tracer Visibility:路径元素可见性(被激活时、总是激活、总是不激活)
- Cursor Visibility:光标可见性(被激活时、总是激活、总是不激活)
- Tracer Density:路径元素密度
- Cursor Radius:光标半径
- Rescale Tracer:根据曲线长短自动缩放路径
- Custom Cursor:自定义光标
- Custom Tracer:自定义路径元素
①更换射线的路径元素以及光标,需要在Custom Cursor和Custom Tracer两个属性栏上添加需要替换成的其他模型即可,其他配置根据实际内容自我调整好即可。
②附上自行修改将路径修改为连续直线的方法:
I.新建一个空物体,添加上LineRenderer
组件
II.将Width属性值修改为0.01
III.取消勾选Use World Space
IV.展开Position属性,将下面的1改为2
V.将制作好的”线”添加到Custom Tracer属性中即可
VI.若颜色依旧是洋红色(上色失败),在LineRenderer上给个材质球就行
③路径元素也可以使用带动画的模型,VRTK里面也有个可作为动态路径的动画预制体,可以尝试使用