2025-04-08 NO.4 Quest3 交互教程


​ 新版 Meta SDK(v74)优化了 Quest 开发流程,使得原本复杂的开发设置变得简单了许多,这在旧版(v63)是不可想象的!

​ 特此记录。

配置环境:

  • Windows 11
  • Unity 6000.0.42f1
  • Meta SDK v74.0.2
  • Quest3

旧版链接:

Quest3 环境配置教程:

1 环境准备

​ 创建新场景 InteractionDemo,删除 Main Camera。

image-20250408050306272

2 新手指引:Building Blocks

​ Building Blocks 是 Meta 推出的 Unity 内置开发教程,通过拖拽的形式快速配置开发环境,并带有错误检查功能。下面我们来看看。

2.1 创建 OVR 相机

​ 选择菜单栏中的“Meta”,依次点击“Tools”->“Building Blocks”。

image-20250408050420020

​ 将 Camera Rig 块拖拽到 Hierarchy 窗口中。

image-20250408050738455

​ 即可创建出 OVR Camera Rig。其名称由 “[BuildingBlock]” 开头,表示由 Building Blocks 创建。

​ 点击该物体,在 Inspector 面板中可看到 BuildingBlock 的介绍,包括:

  • Version:版本
  • Dependencies:该块的依赖。
  • Used by:被 xxx 引用。

​ 此时佩戴 Quest3 运行 Unity,即可看到场景。

image-20250408050902840

2.2 创建交互功能

​ 打开 Building Blocks,选择 “Interaction” 分类,将 “Controller Interactions” 拖拽到 Hierarchy 窗口中。Building Blocks 会自动为我们创建 Interaction 模块,包括 OVRHmd 和 Controller Interactions。同时在 TrackingSpace 下创建对应的 Anchor。

image-20250408051707751

​ 此时运行 Unity,可以识别到手柄,但无法交互。接下来配置可交互物体。

2.3 创建交互物体

​ 将 “Grab Interaction” 拖拽到 Hierarchy 窗口中。可看到创建了一个 Cube,并自动为其创建了 HandGrab 子物体,该物体上挂载了 Grabbable、Hand Grab Interactable 和 Grab Interactable 脚本。在以往版本(v63)中,这些都需要一个个手动创建,而且还需要记住脚本间的相互引用,天呐!😢

​ 可以看到,已添加的块右下角图标和未添加的块有所区别(下图绿色标识)。

image-20250408052408732

​ 此时运行 Unity,即可直接用手抓 Cube 了!

​ 但建议将 Cube 先放在一个合适的位置,并且将 OVRCameraRig 下 CenterEyeAnchor 的相机背景改为 Skybox,否则容易看不到物块。

image-20250408053221044

​ 其他 Block 大家自行探索。

3 老手开发:Interaction SDK

​ 尽管 Building Blocks 很令人经验,但是其功能块有限,无法满足定制化的需求(例如 UI 交互)。

​ 但是,Meta 还是贴心地给出了方便的解决方案:右键 -> Interaction SDK。

​ 而在老版本(v63)中,右键出不来 Interaction SDK:😿

image-20250408060042766

​ 现在,我们将场景中所有物体删除,只保留 Directional Light,重新从零开始。

3.1 创建交互功能

​ 在 Hierarchy 窗口中右键,依次选择 Interaction SDK -> Add OVR Interaction Rig。

image-20250408053949743

​ 弹出提示面板,提示我们需添加 OVR Camera Rig。点击 Fix All,再点击 Create 创建 OVR Interaction Rig。

image-20250406221430285

​ 可以看到创建了 OVRCameraRig,其子物体包括:

image-20250408054221406
  • TrackingSpace:用于跟踪与获取设备数据。
  • OVRInteractionComprehensive:字面意思是全面的 Interaction,确实可以看到,什么交互功能都有(懒人必备)。
image-20250408054439340

​ 展开 OVRCameraRig,找到其子物体 PlayerController,将 “First Person Locomotor.cs” 脚本上 Gravity Factor 改为 0,避免进入场景玩家立即下坠。

image-20250408061347180

3.2 创建交互物体

​ 在 Hierarchy 窗口中右键,依次选择 3D Object -> Cube。创建一个 Cube,用于抓取(可以顺便改一下位置和缩放,方便后续好抓)。

image-20250408054601537

​ 选中 Cube,右键,还是选择 Interaction SDK。此时由于选中了物体,比上次多了 6 个选项,其中第 3-6 个是用于 3D 物体交互的,分别为:

  • Add Grab Interaction:添加抓取交互(手柄 + 手势均支持)。
  • Add Ray Interaction:添加射线交互(手柄 + 手势均支持)。
  • Add Distance Grab Interaction:添加远距离抓取交互(手柄 + 手势均支持)。
  • Add Teleport Interaction:添加传送交互(手柄支持)。

​ 这里以第一个为例,选择 Add Grab Interaction。

image-20250408054824967

​ 弹出了提示窗口,提醒说必须为 Cube 添加 Rigidbody 组件才能 Grab。点击 Fix,然后 Create。

image-20250406222014763

​ 可以看到为 Cube 创建了 ISDK_HandGrabInteraction 子物体,该物体上挂载了 Grabbable、Hand Grab Interactable 和 Grab Interactable 脚本。

  1. Grabbable:该物体允许被抓取(必需)。
  2. Hand Grab Interactable:支持手势抓取(可选)。
  3. Grab Interactable:支持手柄抓取(可选)。
image-20250408055406711

​ 此时运行 Unity,即可使用手柄或手势抓取 Cube!

4 UI 交互

​ 新版 SDK 中,配置 UI 交互也变得非常简单。这里我将其分为以下 2 类。

4.1 3D 按钮

​ 叫 3D 按钮,是因为这是 3D 交互,且仅支持按钮交互hh。在 Building Blocks 里面找到 Poke Interaction,拖进来。

image-20250408060506744

​ 将额外添加的 [BuildingBlock] Hand Interactions 删去,咱有 OVRInteractionComprehensive 了。

image-20250408062717285

​ Poke Interaction 的层级结构如下:

  • Poke Interaction(Poke Interactable 脚本使得其能够被点击)
    • Model(Surface 的父物体,无特殊功能)
      • Surface(定义按到底的平面)
    • Visuals(ButtonVisual 的父物体,会比 Surface 突出一些,营造 3D 立体感)
      • ButtonVisual(渲染按钮部分)

​ 该 3D 交互的原理是,手将 Visuals 向前推,推到与 Surface 重合时便停止不动,给人一种真实按下的感觉。

​ 此时运行 Unity,可以按下该 Button,但什么都不会发生。要使得按下能够出发相应事件,需要在 Poke Interaction 物体上挂载 Interactable Unity Event Wrapper 脚本。并执行以下操作:

  1. 关联哪个 Interactable 被监听。这里将 Poke Interactable 拖拽到 Interactable View 中进行关联(下图红色标注)。
  2. 脚本中依据事件名称关联相应的方法。例如,这里我在 Select 中关联了 Cube 的 SetActive 方法,并传入 false(未勾选下方按钮)。
image-20250408062802104

​ 此时,运行 Unity,按下 Button 后,Cube 将消失。

4.2 Unity UI

​ 如果想和 Unity 中的 2D UI 交互,只需要一步操作即可。

​ 这种方法支持 Unity 中的大部分 UI,例如 Button、Toggle、Slider 等。交互功能没有问题,但给人感觉体验不如 3D Button。

​ 首先右键选择 UI -> Button - TextMeshPro,创建 Unity Button。

image-20250408063141002

​ 将 Canvas 的 Render Mode 设置为 World Space,并更改其位置和长宽(之前的太大了)。Button 也更改小一点。

image-20250408063329750

​ 选中 Canvas,右键依次选择 Interaction SDK -> Add Poke Interaction Canvas。

image-20250408063613843

​ 弹出提示界面,需要在 EventSystem 中添加 Pointable Canvas Module 脚本以支持 UI 的 Point 交互。点击 Fix,再点击 Create。

image-20250408063729816

​ 可以看见为 Canvas 创建了 ISDK_PokeInteraction 子物体,其挂载了:

  • Poke Interactable:可被点击。
  • Pointable Canvas:使 Canvas 下的所有 UI 支持点击操作。
image-20250408063928013

​ 之后,就可以像往常 Unity 开发一样,在 UI 中添加对应的事件了。

image-20250408064205330

​ 此时运行 Unity,点击按钮,即可将 Cube 隐藏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔗理苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值