【Unity】虚拟现实 VRTK插件使用教程(二)人物传送、光标指针、传送规则、玩家区域检测


人物移动

通常VR人物移动有三种方式:

  1. 传送、瞬移。
    在这里插入图片描述
  2. 通过滑动触摸板移动。
  3. 通过不停上下摆动左右手柄实现跑步,由于此方式会占用双手,所以不太常用。

传送

要想实现传送,首先要给左(右)手控制器添加VRTK_Pointer组件和VRTK_Bezier Pointer Renderer组件,并将VRTK_Bezier Pointer Renderer组件拖拽到VRTK_Pointer组件的Pointer Renderer属性中。
游戏运行后默认界面如下:
在这里插入图片描述
将光标切换到指定好的手柄,然后点击TouchPad按键,就会出现如下的贝塞尔曲线,曲线下方的绿色圆盘就是传送的目标点。
顺便提示,默认按键不好用,建议自己设置一下,设置方法请参考上一篇文章《【Unity】虚拟现实 VRTK插件使用教程(一)插件基本配置》。

实现结果如下图:
在这里插入图片描述

光标指针

光标指针 VRTK_Pointer 组件可以为物体提供一个虚拟的指针组件,我们可以通过设置这个指针来处理一些与射线、抛物线相关的内容。例如,Pointer Renderer属性用于指定光标指针的渲染器,不同的渲染器提供了不同的指向终点的方式,并提供了一些将指针路径渲染出来的功能。

光标激活设置

Pointer Activation Setting是关于光标激活的设置。该设置主要用于设置与激活光标相关的操作,也就是设置光标如何出现。

  • Activation Button:可以改变触发光标指针功能的按键。
  • Hold Button To Activate:用于设置按键使用的方式。
  • Activate On Enable:用于设置是否在OnEnable中触发光标。
  • Activation Delay:用于设置延迟触发。

光标事件

  • PointerStateValid: 光标激活时引发
  • PointerStateInvalid: 光标禁止时引发
  • ActivationButtonPressed: 按下激活按钮时引发
  • ActivationButtonReleased: 释放激活按钮时引发
  • SelectionButtonPressed: 按下选择按钮时引发
  • SelectionButtonReleased: 释放选择按钮时引发
  • DestinationMarkerEnter(父类): 光标进入目标点
  • DestinationMarkerExit(父类): 光标离开目标点
  • DestinationMarkerHover(父类): 光标在目标点悬停
  • DestinationMarkerSet(父类): 光标选中目标点

光标指针渲染器

VRTK提供两种光标指针渲染器,即射线指针渲染器(VRTK_StraightPointerRenderer)和贝塞尔曲线指针渲染器(VRTK_BezierPointerRenderer)。通常情况下使用贝塞尔曲线指针较多。注意,VRTK_Pointer组件只是建立了一个指针但不提供指针的具体位置和界面渲染,实际上使用哪种指针取决于Pointer Renderer属性指定了哪种指针组件。所以,VRTK_Pointer就像一个接口,提供了指针的基础规则,而真正产生指针数据和界面渲染的是VRTK_StraightPointerRenderer组件或VRTK_Bezier Pointer Renderer组件。
在这里插入图片描述
在这里插入图片描述

更换按键

如果不想要触摸板按键,可以调整VRTK_Pointer组件下的Activation Button属性修改按键。
在这里插入图片描述
通过调整VRTK_Bezier Pointer Renderer组件的Tracer Density属性可以贝塞尔曲线的显示密度,数值越大密度越大,下图为此属性设置为100时的效果:
在这里插入图片描述

改变力度

通过改变Height Limit Angle属性的大小可以调节传送高度的限制角度(可以理解为仰视角的角度限制),值越大可传送高度越高,设置方法如下图所示:
在这里插入图片描述

改变外观

如果想改变曲线的外观,可以改变VRTK_Bezier Pointer Renderer组件Bezier Pointer Custom Appearance Settings属性下的四个属性,具体内容可参考VRTK实例022_Controller_CustomBezierPointer或实例036_Controller_CustomCompoundPointer。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Component内容拷贝【Unity小窍门】

顺便学习一下拷贝组件的方法,在案例中的组件上点击Copy Component,再到自己的组件上点击Paste Component Values,这样就把别人的组件内容复制到自己的组件上了。
在这里插入图片描述
这样案例中的设置我们就拿到手了,实现效果如下:
在这里插入图片描述

实现传送效果

给Body附加传送组件(VRTK_BasicTeleport或VRTK_HeightAdjustTeleport),Basic的功能相对简单,建议使用HeightAdjust组件,因为此组件允许玩家传送到更高的位置,而Basic只能传送到当前高度以及下层的位置。


至此,基本的传送功能就实现了,下面进行进一步优化。

功能优化

传送规则(设置传送禁区)

如果想要限制部分区域不允许传送,可以给手柄控制器添加VRTK_PolicyList组件,并将此组件拖拽到VRTK_Pointer组件的Target List Policy属性中,如下图:
在这里插入图片描述
组件的属性决定了哪些地方可以传送,哪些地方不能传送,具体属性内容如下:

  • Operation:该属性用于指定规则,第一种规则 Ignore(指定区域不可传送),第二种规则 Include(只有指定区域可传送)。
  • Check Types:该属性用于指定验证区域的类型,其中常用的有Layer(验证层)和Tag(验证标签),该属性可以复选,如果Operation选择的是 Ignore ,则相应的层或者标签下的物体将不可传送。
  • Size、Element:设置了限制的具体内容,如果Check Types选择了Layer层,则Element中填写层的名称,如果选择了Tag标签,则Element中填写标签名称。Size用于指定Element的数量。

使用了VRTK插件后会自动生成一个Tag叫做ExcludeTeleport,我们可以将Operation选为Ignore,将Check Types选为Tag,将Element 0设置为ExcludeTeleport,再给不想让玩家传送的物体指定标签为ExcludeTeleport,这个物体就不能被传送了,如下图:
在这里插入图片描述
注意:通常情况下,场景物体形状可能会比较复杂(面数过多),这时候可以制作一些简单的物体作为碰撞体(顺便把MeshRenderer组件取消掉,以实现隐藏效果),将这个简单的物体覆盖在复杂的场景物体之上,这样就能有效降低碰撞检测的消耗

玩家区域碰撞检测

当传送点为墙壁或者狭小空间时,如果不进行碰撞检测,遇到墙壁时传送点将会是墙壁正下方,角色传送过去会出现穿模的情况,所以要根据角色体型限制传送点与墙壁的间距。如果传送点是很狭小的空间,角色也应该设置碰撞检测,以避免穿模或其他bug。

设置方法:给手柄控制器增加VRTK_PlayAreaCursor组件,勾选Handle Play Area Cursor属性,设置Play Area Cursor Dimens属性(检测范围),并将此组件拖拽到光标指针组件的Playarea Cursor属性中。
在这里插入图片描述
此时传送终点会变成一个方框,如果方框内有墙壁等物体就会无法传送,实现结果如下:
在这里插入图片描述

在这里插入图片描述
方框形状由Play Area Cursor Dimens属性的x、y值决定。

忽略检测触发器

在游戏中经常会出现一些透明物体用做事件触发(比如当玩家进入某个区域生成新的敌人),这些物体被称为触发器,由于触发器有自己的碰撞体,即便触发器是透明的但传送点依然会将此物体视为实体,并允许传送到物体的上方。这种情况是我们所不允许的,所以要进行忽略检测。
在这里插入图片描述
实现忽略检测的方法:给手柄控制器添加VRTK_CustomRaycast组件,将Layers To Ignore属性设置为Trigger(该层是自己手动添加的,触发器的物体都应该在这个Layer中),将组件拖拽到光标指针的Custom Raycast属性中,如下图所示:
在这里插入图片描述

玩家区域碰撞检测忽略触发器

前面讲到的玩家区域碰撞检测在遇到触发器时会出现无法传送的情况,需要进行玩家区域的碰撞忽略功能设置。
设置方法:为手柄控制器再次添加一个新的VRTK_Policy List组件,设置需要忽略的层,然后将此组件拖拽到VRTK_PlayAreaCursor组件的Target List Policy属性中。
在这里插入图片描述


更多内容请查看总目录【Unity】Unity学习笔记目录整理

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值