在 Interaction Toolkit 新版本中,如果使用新版本中的 XR Origin 预制体进行场景初始化,跳跃功能会默认集成在预制体中,开发者无需手动实现,程序运行时,通过点击右手手柄控制器的 A 键即可实现跳跃。
要了解 Interaction Toolkit 中跳跃功能的实现,首先需要了解相关游戏对象的结构。

在游戏对象 XR Origin 下的 Locomotion 中,包含了一个名为 Jump 的子物体,在其上挂载了一个名为 Jump Provider 的组件,这是实现跳跃功能的主要组件。值得注意的是,跳跃功能并不仅凭 Jump Provider 实现,在 Interaction Toolkit 的移动架构中,各种移动形式不仅需要各自的 Provider,还需要一个全局管理角色 Locomotion Mediator 来管理协调不同的移动方式。
并非所有 VR 项目都需要跳跃功能,而默认情况下跳跃功能占用了右手控制器的 A 键。如果项目不需要跳跃或者需要在 A 键上实现其他功能,此时在 Hierarchy 窗口中将 Jump 子物体隐藏即可禁用跳跃功能。

接下来详细介绍 Jump Provider 组件包含的重要参数。

该参数继承自其父类,其它继承自相同父类的 Move、Climb、Gravity 也都具有这样的参数,用于设定当前移动形式的优先级,Locomotion Mediator 据此处理不同移动方式的先后顺序,即在同一帧中,按照此参数设定的优先级顺序依次处理对应形式的移动方式。
参数默认值为 0,数值越低优先级越高。例如,对于跳跃来说,它通常会配合行走使用(即一边行走一边跳跃),通过设定优先级可以让 Locomotion Mediator 决定先处理行走还是先处理跳跃。
如果优先级相同,Locomotion Mediator 会按照默认排序处理,一般情况下,此参数保持默认值即可。
该参数表示每次跳跃的最高高度。默认值为 1.25,即每次跳跃最高可达 1.25 米(Unity 中的单位是米)。
在某些项目中,特别是模拟不同重力环境(如月球、火星)的场景中,可以适当调高跳跃高度来反映不同的重力加速度效果。
Interaction Toolkit 提供的跳跃功能,能够让用户在起跳后至落地前,通过再次按下跳跃键进行二次跳跃,也就是所谓的连跳。
Jump Forgiveness Window 用于设定可以连跳的时间窗口——在第一次跳跃后多长时间内可以进行连跳。超过以上设定的时间,用户将无法进行连续跳跃。
勾选该选项后,用户可以在空中无限次地连续跳跃,不断提高自己的高度,该参数更多用于游戏中,如果你的游戏需要这种功能,可以启用它。如果不勾选该参数(默认不勾选),表示能够进行有限次数(包括 1 次)的连续跳跃,此时会出现以下参数。
该参数用于设定在空中可以连续跳跃的有限次数。默认值为 1,表示只能在跳跃时间窗口跳跃 1 次。当设置更多次数如 5 或 10,意味着用户最多可以在空中连跳 5 次或 10 次。
勾选此选项后,跳跃过程中将禁用重力。这会使跳跃过程更加柔和丝滑,用户会感觉到一种类似失重的体验,不勾选则在跳跃中仍然受到重力影响,更接近现实体验。
勾选此选项后,允许用户在还没达到最大跳跃高度前,通过松开按键来提前结束跳跃。即,用户可以通过按键时长来控制跳跃高度。
勾选此项后会出现三个相关参数:
该参数用于指定与跳跃相关的输入动作。在 Interaction Toolkit 的新版本中,引入了 Input Reader 机制,该参数是其中的一个变体 XRInputButtonReader。要对此类型的参数赋值,需要指定两个动作:一个用于检测动作是否发出,另一个用于读取动作标量值(Scalar Value),对于按键来说,值为 0 或 1。这种双动作设计使开发者可以更精确地控制 XR 体验中的跳跃机制,既可以简单地检测跳跃指令的触发,又可以根据输入的强度调整跳跃的表现形式。
如果项目交互功能需求与跳跃功能按键冲突,比如,项目需要按下 A 键弹出 UI 菜单而不是跳跃,此时需要将跳跃功能绑定到其他按键(例如从右手 A 键改为 B 键,或者转移到左手),可执行以下步骤:
![Input Actions 编辑窗口,XRI Right Locomotion 下的 Jump 动作绑定在 PrimaryButton [RightHand XR Controller] 上](/images/posts/xri-jump-provider/04-jump-action-binding.png)
如果要将跳跃功能绑定到左手手柄控制器上,步骤稍有不同,需要新建动作并完成按键绑定,可执行以下步骤:
![在 XRI Left Locomotion 下新建的 Jump 动作,绑定到 PrimaryButton [LeftHand XR Controller]](/images/posts/xri-jump-provider/05-left-hand-jump-binding.png)
除了在 Inspector 中可见的参数外,Jump Provider 组件还有两个值得关注的重要属性:
以上两个属性在开发中非常有用,可以用来实现一些比较常用的交互功能,比如播放落地时音效、通过判断跳跃状态开发特定游戏逻辑等。如下代码所示:
// 获取 JumpProvider 类的引用
var jumpProvider = GetComponent<JumpProvider>();
// 读取 isJumping 参数状态
bool isAscending = jumpProvider.isJumping;
// 读取 isGrounded 参数状态
bool isOnGround = jumpProvider.isGrounded;
本文详细介绍了 XR Interaction Toolkit 中的跳跃功能。作为内置功能,它通过 Jump Provider 组件提供了丰富的参数配置,能够满足各种 VR 游戏和应用的需求。
通过调整参数,开发者可以实现多种跳跃效果,如单次跳跃、连续跳跃、可变高度跳跃等。同时,还可以根据项目需求修改按键绑定或完全禁用跳跃功能。
本文首发于微信公众号「XR技术研习社」:阅读原文