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

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

作者:互联网

文章目录


人物移动

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

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

传送

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

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

光标指针

VRTK提供两种光标指针,即射线指针(VRTK_StraightPointerRenderer)和贝塞尔曲线指针(VRTK_Bezier Pointer Renderer)。通常情况下使用贝塞尔曲线指针较多。注意,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_Basic Teleport或VRTK_HeightAdjustTeleport),Basic的功能相对简单,建议使用HeightAdjust组件,因为此组件允许玩家传送到更高的位置,而Basic只能传送到当前高度以及下层的位置。


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

功能优化

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

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

使用了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学习笔记目录整理

标签:插件,VRTK,传送,组件,指针,Pointer,虚拟现实,属性
来源: https://blog.csdn.net/xiaoyaoACi/article/details/120222363