Oculus Integration で照準を定めた遠隔物体を引き寄せて掴む【Distance Grabbable / Distance Grabber】
Oculus Integration を用いて照準を定めた遠隔物体を引き寄せて掴む方法のまとめ.
DistanceGrab pic.twitter.com/R9EDrY3raS
— xrdnk (@xrdnk) 2020年5月30日
上のツイートみたいな感じ.
前準備
Oculus Integration をインポート.動作確認時点では 15.0 でした. Oculus Quest ビルドが出来るように設定を行い,適当に床と掴みたい物体を設置してください. 床にはColliderを,掴みたい物体にはRigidbodyとColliderをアタッチし,最後にOVRPlayerControllerを配置してください. 一応掴みたい物体に重力の影響を与えたい場合はUse Gravityにチェックを入れてください. また掴みたい物体のCollision DetectionをContinuous Dynamicにすると,プレイヤーが動いていても判定が取りやすくなります.
Collision Detection の詳細
こちらの記事が詳しく書かれております.必見です.
手順
- DistanceGrabHandLeftをLeftHandAnchorの子に,DistanceGrabHandRightをRightHandAnchorの子に配置.
DistanceGrabHandにはDistance Grabberスクリプトがアタッチされてます. このスクリプトは OVR Grabber を継承してます.
- Distance Grab 用の Layer を追加します.
今回は User Layer 9 に DistanceGrabLayer を追加してます.
- DistanceGrabHandLeft / DistanceGrabHandRight にアタッチされている Hand と Distance Grabber のパラメタを設定.
DistanceGrabHandLeft
DistanceGrabHandRight
Distance Grabber の他の各パラメタについては後程詳細を書きます.
- 掴みたい物体(ここではBroomstick)にDistance Grabbable スクリプトをアタッチ.Layer を DistanceGrabLayer にする.
- 空オブジェクトを掴みたい物体の子として作る.Crosshairと名付ける.これが照準になります.
- Quad オブジェクトを Crosshair の子として2つ作る.Scaleを掴みたい物体に合わせて調節する.
階層構造はこんな感じ.
- 一つ目のQuadオブジェクトを Targeted と名付け,Mesh RendererのMaterials Element 0 に TriangleCursorTargeted を入れる.
- 残りのQuadオブジェクトを Untargeted と名付け,Mesh RendererのMaterials Element 0 に TriangleCursorUntargeted を入れる.
- Crosshair オブジェクトに Grabbable Crosshair スクリプトをアタッチし,Targeted Crosshair に Targetedオブジェクトを,Enabled Crosshair に Untargeted オブジェクト を入れる.
少し見えづらくて申し訳ないですが,DistanceGrabHandLeft/Right > gripTrans > GrabVolumeCone の範囲内に照準があれば, 引き寄せて掴める判定になります.
- 空オブジェクトを作り,TrackingSpaceまたはOVRPlayerControllerの子とします.DistanceGrabManagerと名付けます.
- Grab Manager スクリプトと Sphere Collider をアタッチします.Is Trigger にチェックを入れるのを忘れずに!
この Sphere Collider の Radius が 遠隔物体を引き寄せられる射程距離になります.
お疲れ様でした.ここまでできれば完成です.実際にビルドして試してみてください. 上手く行かない場合はコメントをお願いします.