【Unity】虚拟现实 VRTK插件使用教程(二)人物传送、光标指针、传送规则、玩家区域检测
2021/9/11 6:06:30
本文主要是介绍【Unity】虚拟现实 VRTK插件使用教程(二)人物传送、光标指针、传送规则、玩家区域检测,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 人物移动
- 传送
- 光标指针
- 更换按键
- 改变力度
- 改变外观
- Component内容拷贝【Unity小窍门】
- 实现传送效果
- 功能优化
- 传送规则(设置传送禁区)
- 玩家区域碰撞检测
- 忽略检测触发器
- 玩家区域碰撞检测忽略触发器
人物移动
通常VR人物移动有三种方式:
- 传送、瞬移。
- 通过滑动触摸板移动。
- 通过不停上下摆动左右手柄实现跑步,由于此方式会占用双手,所以不太常用。
传送
要想实现传送,首先要给左(右)手控制器添加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属性中,如下图:
组件的属性决定了哪些地方可以传送,哪些地方不能传送,具体属性内容如下:
- 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学习笔记目录整理
这篇关于【Unity】虚拟现实 VRTK插件使用教程(二)人物传送、光标指针、传送规则、玩家区域检测的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南