Interaction Toolkit 跳跃功能详解

PUBLISHED ON 2025年4月9日 / 11 MIN READ — XR

本文主要内容

  • 介绍实现跳跃功能的 Jump Provider 组件
  • 如何禁用跳跃功能
  • 如何将跳跃功能绑定到其他按键上

跳跃功能概述

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

跳跃功能的实现结构

要了解 Interaction Toolkit 中跳跃功能的实现,首先需要了解相关游戏对象的结构。

XR Origin 下的 Locomotion 节点,Turn、Move、Grab Move、Teleportation、Climb、Gravity、Jump 都是它的子物体

在游戏对象 XR Origin 下的 Locomotion 中,包含了一个名为 Jump 的子物体,在其上挂载了一个名为 Jump Provider 的组件,这是实现跳跃功能的主要组件。值得注意的是,跳跃功能并不仅凭 Jump Provider 实现,在 Interaction Toolkit 的移动架构中,各种移动形式不仅需要各自的 Provider,还需要一个全局管理角色 Locomotion Mediator 来管理协调不同的移动方式。

如何禁用跳跃功能

并非所有 VR 项目都需要跳跃功能,而默认情况下跳跃功能占用了右手控制器的 A 键。如果项目不需要跳跃或者需要在 A 键上实现其他功能,此时在 Hierarchy 窗口中将 Jump 子物体隐藏即可禁用跳跃功能。

Hierarchy 中的 Jump 子物体,Inspector 里可以看到它挂的是 Jump Provider 组件

Jump Provider 组件主要参数介绍

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

Jump Provider 组件的完整参数列表,分为 Jump Settings、Air Jump Settings、Variable Height Jump Settings 三组,末尾是 Jump Input

Transformation Priority(移动优先级)

该参数继承自其父类,其它继承自相同父类的 Move、Climb、Gravity 也都具有这样的参数,用于设定当前移动形式的优先级,Locomotion Mediator 据此处理不同移动方式的先后顺序,即在同一帧中,按照此参数设定的优先级顺序依次处理对应形式的移动方式。

参数默认值为 0,数值越低优先级越高。例如,对于跳跃来说,它通常会配合行走使用(即一边行走一边跳跃),通过设定优先级可以让 Locomotion Mediator 决定先处理行走还是先处理跳跃。

如果优先级相同,Locomotion Mediator 会按照默认排序处理,一般情况下,此参数保持默认值即可。

Jump Height(跳跃高度)

该参数表示每次跳跃的最高高度。默认值为 1.25,即每次跳跃最高可达 1.25 米(Unity 中的单位是米)。

在某些项目中,特别是模拟不同重力环境(如月球、火星)的场景中,可以适当调高跳跃高度来反映不同的重力加速度效果。

Jump Forgiveness Window(跳跃缓冲窗口)

Interaction Toolkit 提供的跳跃功能,能够让用户在起跳后至落地前,通过再次按下跳跃键进行二次跳跃,也就是所谓的连跳。

Jump Forgiveness Window 用于设定可以连跳的时间窗口——在第一次跳跃后多长时间内可以进行连跳。超过以上设定的时间,用户将无法进行连续跳跃。

Unlimited In Air Jumps(无限空中跳跃)

勾选该选项后,用户可以在空中无限次地连续跳跃,不断提高自己的高度,该参数更多用于游戏中,如果你的游戏需要这种功能,可以启用它。如果不勾选该参数(默认不勾选),表示能够进行有限次数(包括 1 次)的连续跳跃,此时会出现以下参数。

In Air Jump Count(空中跳跃次数)

该参数用于设定在空中可以连续跳跃的有限次数。默认值为 1,表示只能在跳跃时间窗口跳跃 1 次。当设置更多次数如 5 或 10,意味着用户最多可以在空中连跳 5 次或 10 次。

Disable Gravity During Jump(跳跃时禁用重力)

勾选此选项后,跳跃过程中将禁用重力。这会使跳跃过程更加柔和丝滑,用户会感觉到一种类似失重的体验,不勾选则在跳跃中仍然受到重力影响,更接近现实体验。

Variable Height Jump(可变高度跳跃)

勾选此选项后,允许用户在还没达到最大跳跃高度前,通过松开按键来提前结束跳跃。即,用户可以通过按键时长来控制跳跃高度。

勾选此项后会出现三个相关参数:

  • Min Jump Hold Time(最小跳跃按键时间):用户需要至少按下跳跃按键多长时间才能起跳。默认为 0.1 秒。
  • Max Jump Hold Time(最大跳跃按键时间):用户需要按住跳跃按键多长时间才有可能达到最大跳跃高度。默认为 0.5 秒。
  • Early Out Deceleration Speed(提前结束减速速度):当用户在上升过程中松开按键时,上升速度的衰减程度。数值越大,减速越快。

Jump Input(跳跃输入)

该参数用于指定与跳跃相关的输入动作。在 Interaction Toolkit 的新版本中,引入了 Input Reader 机制,该参数是其中的一个变体 XRInputButtonReader。要对此类型的参数赋值,需要指定两个动作:一个用于检测动作是否发出,另一个用于读取动作标量值(Scalar Value),对于按键来说,值为 0 或 1。这种双动作设计使开发者可以更精确地控制 XR 体验中的跳跃机制,既可以简单地检测跳跃指令的触发,又可以根据输入的强度调整跳跃的表现形式。

如何修改跳跃按键绑定

如果项目交互功能需求与跳跃功能按键冲突,比如,项目需要按下 A 键弹出 UI 菜单而不是跳跃,此时需要将跳跃功能绑定到其他按键(例如从右手 A 键改为 B 键,或者转移到左手),可执行以下步骤:

  1. 在 Jump Provider 组件中点击 Jump Input 参数值,在 Project 窗口中找到对应的动作
  2. 双击此动作,打开动作编辑窗口。
  3. 默认的跳跃动作(Action)位于 XRI Right Locomotion 分类下,名称为 Jump。
  4. 找到具体的按键绑定(默认是右手的 Primary Button,即 A 键)。
  5. 在窗口右侧的 Path 绑定中,展开并重新绑定到所需按键(如 RightHand Controller 下的 Secondary Button,即 B 键)。
  6. 绑定完成后,点击窗口右上角的 Save Asset 按钮保存设置。

Input Actions 编辑窗口,XRI Right Locomotion 下的 Jump 动作绑定在 PrimaryButton [RightHand XR Controller] 上

绑定到左手手柄

如果要将跳跃功能绑定到左手手柄控制器上,步骤稍有不同,需要新建动作并完成按键绑定,可执行以下步骤:

  1. 在动作编辑窗口,Action Maps 栏中找到 XRI Left Locomotion 分类
  2. 由于左手手柄控制器默认没有 Jump 动作,需要点击右上角加号新建一个动作并命名为 Jump
  3. 在右侧 Path 绑定设置中选择 XR Controller > XR Controller(Left Hand) > Usage
  4. 选择所需按键(如 Primary Button,即左手 X 键)
  5. 绑定完成后点击窗口右上角的 Save Asset 按钮保存设置
  6. 返回 Jump Provider 组件,将 Jump Input 的两个字段都重新指定为刚创建的左手 Jump 动作

在 XRI Left Locomotion 下新建的 Jump 动作,绑定到 PrimaryButton [LeftHand XR Controller]

值得关注的两个参数

除了在 Inspector 中可见的参数外,Jump Provider 组件还有两个值得关注的重要属性:

  • Is Jumping:布尔类型,判断用户是否正在跳跃
  • Is Grounded:布尔类型,判断用户是否站在地面上

以上两个属性在开发中非常有用,可以用来实现一些比较常用的交互功能,比如播放落地时音效、通过判断跳跃状态开发特定游戏逻辑等。如下代码所示:

// 获取 JumpProvider 类的引用
var jumpProvider = GetComponent<JumpProvider>();
// 读取 isJumping 参数状态
bool isAscending = jumpProvider.isJumping;
// 读取 isGrounded 参数状态
bool isOnGround = jumpProvider.isGrounded;

总结

本文详细介绍了 XR Interaction Toolkit 中的跳跃功能。作为内置功能,它通过 Jump Provider 组件提供了丰富的参数配置,能够满足各种 VR 游戏和应用的需求。

通过调整参数,开发者可以实现多种跳跃效果,如单次跳跃、连续跳跃、可变高度跳跃等。同时,还可以根据项目需求修改按键绑定或完全禁用跳跃功能。


本文首发于微信公众号「XR技术研习社」:阅读原文