VRTK4.0学习(七):Teleporter传送功能

前言

在虚拟空间中移动的一种流行方法是通过传送。用户可以在虚拟世界中标记出目的地位置,并自动将自身运输到该位置,而无需任何其他输入。
传送有两种主要类型:
Instant 及时-用户指定目的地位置(例如,用控制器指针标记),然后通常通过相机淡入淡出立即出现在目的地,以减少晕动病。
Dash-用户指定目标位置,并且用户会随着时间的推移以线性运动逐渐移动,直到他们到达其目标位置。
有用的定义
Play Area -包含虚拟玩家的虚拟空间,该虚拟空间代表用户在现实世界中受到物理限制的环境。
Camera Blink -在摄像机视图上应用淡入淡出效果,然后再次淡入淡出以再次查看虚拟世界,通常有助于缓解晕动病。

先决条件

场景中存在一个指针。参见:添加一个激光射线指针

第1步

展开在Unity项目窗口VRTK组合包目录直到Packages -> VRTK Prefabs -> Locomotion -> Teleporters目录是显示可见的,两个传送预制体:Teleporter.Dash和Teleporter.Instant。这两个选项都以相似的方式工作,并为基础的预制件提供相同的公共API。在此示例中,我们将使用Teleporter.Instant预制件。将Teleporter.Instant预制件拖放到“层次结构”窗口中。
在这里插入图片描述

第2步

在Unity层次结构中选择Teleporter.Instant预制体,然后更改Teleporter Facade组件以配置Teleporter的基本功能。
我们必须指定一些数据,以便传送器知道在传送时要移动什么以及如何移动它。
Teleporter Facade组件的Target参数指哪个游戏物体实际移动。通常,“Camera Rig”是我们要移动的GameObject,因为它包含我们的虚拟玩家。
如果由于要支持不同的硬件要求而使用多个SDK CameraRig来设置场景,那么你将看到无法将所有这些CameraRig分配给Teleporter Facade组件上的Target参数。我们也不想为每个“CameraRig”在场景中添加多个Teleporter.Instant预制件。
这是TrackedAlias预制件可以提供帮助的地方。该TrackAlias预制提供了常见的VR物体比如Player Area,Headset和Contoller。
在Unity层次结构中展开TrackedAlias物体,以显示其子物体,然后将TrackedAlias -> PlayAreaAlias物体拖放到TeleporterFacade组件的Target参数中。
这告诉Teleporter,当我们进行传送时,我们想将Play Area移到新位置,这实际上会将虚拟玩家移到新位置。
注意:请勿将Target设置为Headset,因为它始终会更新以匹配现实世界的Headset物理位置,因此虚拟物体位置将始终被立即覆盖。
在这里插入图片描述

第3步

当被瞬间移动,目标位置Target将成为游戏对象新的中心位置。因为我们的虚拟Player Area代表了我们真实的Player Area,所以这意味着如果用户在其真实世界的Player Area周围走动,那么他们的位置实际上会在Player Area内部偏移。
这在传送用户时可能会产生影响,因为用户实际上可能最终期望完全站在他们标记为目标位置的位置上。如果我们仅移动Play Area 物体来匹配目标位置,则用户仍将偏离该目标位置,并且不会到达他们期望的位置。
在这里插入图片描述
此图显示了以下问题:一旦用户从他们的原始位置进行传送,因为他们没有站在Player Area的中心,那么在传送后,Player Area与目标位置匹配,但他们的实际位置并不完全位于他们所在的地点标记为目标位置。
在移动目标的时候,用户可能会期望自己站在目标位置的准确位置上,因此他们当前的现实世界相对于他们现实世界游戏区域的位置需要被考虑在内。
TeleporterFacade组件上的offset参数有助于解决这种情况。offset参数决定了另一个游戏对象,可以用来描述移动目标时考虑的偏移量,在这种情况下,偏移量是用户的Headset位置与他们的游戏区域之间的差异。
因此,要将此偏移量数据提供给Teleporter,我们只需要将TrackAlias -> HeadsetAlias物体拖放到TeleporterFacade组件的Offset参数中即可。
在这里插入图片描述

第4步

无论是Teleporter.Instant与Teleporter.Dash都具有位置发生瞬间变化时做一个对着镜头眨一下淡出屏幕和退出的能力。
该TeleporterFacade组件Camera Validity参数是关联这的简单办法。拖放TrackAlias -> SceneCameras游戏物体进入TeleporterFacade组件Camera Validity参数上。
在这里插入图片描述

第5步

现在,我们在场景中有一个可以正常使用的传送器,我们只需要一种方法就可以告诉传送器移动到所需的目标位置。
我们的Unity层次结构中已经有一个Pointer预制件,因此可以在虚拟世界的有效区域中标记出目标位置。我们只需要挂接Pointer预制件,以告诉Teleporter预制件移至其指向的位置。
让我们在场景中设置Pointer预制件,以便在发生选择操作时告诉Teleporter将用户传送到Pointer目标位置。
指针应该已经被触控板的激活动作所激活,因此可以激活指针,所以让我们实际按下指针来进行指针的选择动作。
本示例假定您使用的Curved Pointer是“ 添加曲线指针”指南中设置的预制件。
在Unity层次结构中展开UnityXR.OpenVR.LeftController -> Trackpad物体,以显示Press[8]物体。它包含Unity Button Action,该Action会在按下“Left OpenVR Controller Trackpad”按钮时侦听。
在Unity层次结构中选择ObjectPointer.Curved物体,然后将UnityXR.OpenVR.LeftController -> Trackpad -> Press[8]物体拖放到Pointer Facade组件中的Selection Action参数上。
在这里插入图片描述

第6步

现在,只要用户按下“左OpenVR控制器轨迹板”按钮,“弯曲指针”预制件就将发出目标位置数据,因此我们要做的就是添加该Selected事件以调用Teleporter。
在ObjectPointer.Curved物体上找到Pointer Facade组件,单击Selected事件参数+右下角的符号,然后将Teleporter.Instant物体拖放到显示框中。
在这里插入图片描述
在Selected事件选择一个组件的Function。对于此示例,请选择TeleporterFacade -> Teleport(在此示例中,请确保选择“动态事件数据-传送”)。
在这里插入图片描述

结语

播放Unity场景,然后触摸左手控制器上的触控板,弯曲指针将把光束发射到要传送到地板上的目标位置。按下左手控制器上的触控板,将在“弯曲指针”上启动“选定”事件,该事件随后又告诉传送器将其传送到指针的目的地。现在,你将可以在场景周围进行自由移动。

注:本文内容引用自VRTK学院。用于自己学习笔记,文章如有描述不当的地方,也欢迎各位朋友在评论处留言指正,感谢大家支持。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值