yukamu 发表于 2022-2-1 11:20

Unity + Oculus Quest 之五 Grab

Oculus Integration

出乎意料的,在 VR 中想要 Grab things,或者想让东西 interactable 很容易,如果是用的 Oculus Integration 的话,还是如同以前一样配置好 project,或者建议可以直接在配置好的 project 中创建一个新的场景,然后依旧:

[*]Assets | Oculus | VR | Prefabs | OVRCameraRig 拖到新建的场景中
[*]CustomHandLeft CustomHandRight 放到相应的位置
[*]删掉默认的 camera
整点 cube, cylinder 弄成保龄球台的样子,当然,记得给 cylinder 添加上刚体,然后新建一个球体,同样添加上刚体,最重要的是 Add Component, 搜索 OVR Grabble,添加上这个 script.
一个简单的保龄球游戏就完成了,一行代码都没有, 。能让这件事这么简单的多亏了 Oculus Integration 内置的脚本 - OVRGrabbable.cs 和OVRGrabber.cs.


使用OVR Grab 也有一些注意事项:

[*]可以设置能够 Grab 的位置,比如一把长刀,我们设置几个 Grab Points
[*]比如如果物体在手中有奇怪的抖动的话,注意是不是要去 CustomHand 的 Inspector 里面选一下 Parent Held Object
XR Interaction Toolkit

如果我们用的是 XR Interaction Toolkit 呢? 完全类似, 甚至我们可以隔空抓取 。同样创建红球,搜索添加 XRGrab Interactable,这样就完成了,可以看到如果是可以互动的物体 - 当这个 Ray 指到这个小球就变色提醒我们可以互动。



(如果你想用 Oculus Integration 做到这样的远处召唤效果,那么需要用 DistanceGrabHandLeft/Right Prefab,添加的 Distance Grabber)
当然如果想要直接抓取,在 LeftHandController 上我们把比如 XR Ray Interaction, Line Renderer, XR Interactor Line Visual 都给删掉,然后搜索添加 XR Direct Interactor, 再添加一个 Sphere Collider, Is Trigger 选中, Radius 设小一点 - 0.08. (但是注意需要把用来表示 controller 方块的 collider 取消,否则可能你还没抓住小球的时候它已经被撞走了, )。



道理也是一样的,感谢内置的 Script,但是这里我们的 controller 用的就是一个方块表示,如果我们想要学 Oculus Integration 一样,用带动画的手来表示的话,那么需要深入理解 InputSystem 和 InputAction.
关于 Grab 还可以注意的点包括:

[*]用 Layer 来管理可以 Grab 的物体, 这样可以设置 Interaction Layer Mask
[*]实际上点开 XR Grab Interactable,也有很多设置选项,包括 haptics,在这里也可以简单的开启它们
更多的可以参考:

[*]add-and-configure-an-interactable-object/XR Interaction Toolkit
[*]DistanceGrab Sample Scene/Oculus Integration
[*]customizing-interactables-in-xr-interaction-toolkit
页: [1]
查看完整版本: Unity + Oculus Quest 之五 Grab