Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

執筆中【Oculus Quest開発メモ】Spherecastで物を掴む Distance Grabber 編【Unity】

執筆中です。

もうしばらくお待ちください

 

 

 

6/28追記

すみません、なかなかいい資料が見つからず大変苦戦しております。
もう少しお待ちくださいませ。何か知見をお持ちの方はぜひコメントにお願いいたします。

 

 

10/24日追記

まだわからない。

目星をつけたのはこのあたり。
・Playerのコライダーが邪魔をしている可能性
・レイヤーの設定がおかしい可能性

 

1回目の掴みは正常に動くが、2回目以降がおかしい現象がおこっています。
1回目に掴んだGrabbableが、投げた後も何故か保持されてしまう。
別のGrabbableを掴もうとしても、最初に掴んだGrabbableしか掴めない。

 

 

 

 

今回はOculus Questの開発ネタをやっていきます。
内容的にはOculus Rift Sなどにもそのまま応用できるかと思います。

 

前回の記事の補足になります。まだの方はこちらからどうぞ。

raspberly.hateblo.jp

 

 

 

 

 

 

 

f:id:Raspberly:20190616202258p:plain

 

 

 

開発環境

Windows 10

Unity 2018.4.1f

Oculus Integration ver1.37

Oculus Quest

 

 

先行研究

www.youtube.com

 

 

セットアップ

前回の記事をあらかじめ見ておいてください。

raspberly.hateblo.jp

前提として、Project内にAssetStoreからOculus Integrationをインポートしておく必要があります。


 

 

 

 

サンプルシーンの確認

Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
離れた物を掴むサンプルシーンはDistanceGrabになります。
学習や挙動の確認にとても有益です。見てみましょう。

f:id:Raspberly:20190610220845p:plain

 

実行してみるとこんな感じになります。

 

f:id:Raspberly:20190610225504g:plain

 

 

 

DistanceGrabberのGrab判定にはSpherecastを使用することができます。

 

Spherecastは簡単に説明すると、球体の形をしたRaycastです。

 

 

 

 

主要コンポーネント

こちらもOVR Grabber&Grabbable同様Oculus側でコンポーネントが用意されています。
そちらを使っていきましょう。
これらはインポートしたOculus Integrationの
Assets/Oculus/sampleFramework/Core/DistanceGrab/Scriptsにあります。

DistanceGrabber

こちらは物を掴む側、つまり手につけるコンポーネントになります。

DistanceGrabbable

こちらは物を掴まれる側、つまりオブジェクト側につけるコンポーネントになります。

Grab Manager

こちらは物を掴む範囲を決めるコンポーネント、DistanceGrabberを使うのに必須です。

 

 

 

DistanceGrabber

DistanceGrabのシーンにある、DistanceGrabを見てみましょう。

f:id:Raspberly:20190611213013p:plain

f:id:Raspberly:20190611213643p:plain

OVR Grabberコンポーネントがついているのがわかります。
手にあたるオブジェクトにはこのコンポーネントが必要です。
(Rigitbodyも必要)

 

このコンポーネントOVR Grabberを継承して作られています
そのため使い方やインスペクターはOVR Grabberに規準しています。

 

 

インスペクターパラメーター(Spherecast関係のみ)

とても多いです。掴める対象物のことをターゲットと呼称します。

 

Spherecasrt Radius

ターゲットを見つけるSpherecastの半径。
Spherecastを使用している場合、この値が大きいほどターゲットを見つける範囲が大きくなる。

No Snap Threshhold

オブジェクトとの距離がこの値より近い場合は、通常のGrabberと同じように掴みます。
この値より離れている場合は手元に引き寄せます。

Use Spherecast

Spherecastを使ってターゲットを見つけるかどうか。

 

Max Grab Distance

掴むことのできるオブジェクトの範囲。

Grab Objects In Layer & Obstruction Layer

掴むターゲットにするレイヤーの数字。

Player

Playerのオブジェクト、子オブジェクトからGrabManagerのSphereColliderを参照するのに使う。

 

 

 

 

DistanceGrabbable

DIstanceGrabbableに関しては特に変更点はありません。
過去にセットアップしたものをそのまま使う事ができます。

 

 

 

 

GrabManager

これはGrabする範囲を決定するコンポーネントです。これがないとGrabberが動きません
SphereColliderとセットで扱います。(要isTrigger)
サンプルシーンではOVRPlayerControllerの子オブジェクトになっています。
必ずプレイヤーの子オブジェクトにする必要があります

 

Outline Colorから、範囲内のオブジェクトにアウトラインをつけることができます。

f:id:Raspberly:20190616163827p:plain

 

SphereColliderのRadiusの値を変えるだけで簡単に範囲を設定できます。

f:id:Raspberly:20190616163746p:plain

GrabManagerのスクリプト内ではCollider型で参照しているのでSphere以外のColliderも使うことができる・・・
かと思いきや、実はDistanceGrabberがSphereCollider型でGetComponentしているのでSphereしかだめみたいです。

 

 

 

 

実際に掴めるオブジェクトを置いてみる

 

 

 

 

 

まとめ

 

 

 

参考文献

DistanceGrab Sample Scene

Distance Grab Sample Now Available in Oculus Unity Sample Framework | Oculus

 

 

 

 

他間違っている箇所、不明な点、わかりにくい点がありましたらコメントにお願いします。