前言
VR中由于走动比较容易头晕,所以基本上玩家移动都是靠传送,这样用户更加直观,传送过去也不会感觉头晕。
好了,那么我们一起来说实现一下OpenXR的传送功能。
准备
我们新建一个3D(URL)项目,导入XR Interactor Toolki,然后配置好,详细配置见下面两篇文章。
创建XR Origin,配置好XRController的相关参数,和手柄预制体等
新建一个空场景,然后创建一个平面作为地面
如下图所示:
创建Localmotion System
通过菜单GameObect->XR->Localmotion System
创建一个Locomotion System
游戏对象,这个对象非常重要,就是它控制着Origin(XR)的移动。它身上有3个组件。
1.Localmotion System组件
Locomotion System对象用于控制对 XR Origin 的移动。它强制一次只有一个Localmotion Provider可以移动 XR Origin。这是唯一控制对 XR Origin 的访问的地方,不建议使用 Locomotion System 的多个实例驱动单个 XR Origin。
2.Teleportation Provider组件
Teleportation Provider负责根据用户请求将 XR Origin 移动到所需位置。
3.ActionBasedSnapTurnProvider组件,
一个运动Provider,是Locomotion Provider的子类,允许用户使用来自输入系统动作的 2D 轴输入来旋转他们的装备。
创建传送点
传送点有两种:
1.TeleportationArea传送区域
2.Teleportation Anchor传送锚点
Teleportation Area
TeleportationArea传送区域,是一个传送目的地,它可以将用户传送到他们在表面上的指定位置。我们可以通过手柄发射射线然后按下Grab键完成传送。
Teleportation Anchor
Teleportation Anchor传送锚,是传送目的地,它将用户传送到预定的锚点位置和旋转
现在我们可以试一下传送效果。
传送抛物线
我们默认使用的是直线射线,不过XR Interactor Toolkit给我们提供了抛物线和贝塞尔曲线个动能。
我们打开手柄上面的 XR Ray Interactor组件,我们找到Raycast Configeration属性,把LineType修改为Projectile Curve类型即可。下面的抛物线的速度,重力加速度等控制着抛物线的远近和弧度,我们先使用默认的。
看一下场景传送效果:
辅助瞄准区域
我们知道射线或者抛物线出去之后,我们对于空间的感受是有误差的,所以需要一个抛物线的辅助瞄准区域,来精确的告诉我们,落点在哪里。XR Toolkit的Stater Assets里面给我们提供了一个禁止传送的标线和一个可传送的标线。我们也可以自己创建一个任意几何体如:Sphere球体,去掉碰撞即可,作为自定义标线。
创建传送瞄准标线有两种方法;
方法一:通过在HandController上面的XR Interactor Line Visual中设置Reticle和Blocked Reticle,这种方法设置好Reticle瞄准标线后,可以在任意Teleportation Area或者Anchor上面显示。
方法二:通过在Teleportation Area或者TeleportationAnchor上面配置Custom Reticle(自定义标线)。
这种方法设置的属于当前Area自定义的瞄准标线,只在当前这个Area上面显示。会覆盖XR Interactor Line Visual上面的设置的默认Reticle。
运行场景,我们可以看到效果如下: