執筆中です。
もうしばらくお待ちください
6/28追記
すみません、なかなかいい資料が見つからず大変苦戦しております。
もう少しお待ちくださいませ。何か知見をお持ちの方はぜひコメントにお願いいたします。
10/24日追記
まだわからない。
目星をつけたのはこのあたり。
・Playerのコライダーが邪魔をしている可能性
・レイヤーの設定がおかしい可能性
1回目の掴みは正常に動くが、2回目以降がおかしい現象がおこっています。
1回目に掴んだGrabbableが、投げた後も何故か保持されてしまう。
別のGrabbableを掴もうとしても、最初に掴んだGrabbableしか掴めない。
今回はOculus Questの開発ネタをやっていきます。
内容的にはOculus Rift Sなどにもそのまま応用できるかと思います。
前回の記事の補足になります。まだの方はこちらからどうぞ。
- 開発環境
- 先行研究
- セットアップ
- サンプルシーンの確認
- 主要コンポーネント
- DistanceGrabber
- DistanceGrabbable
- GrabManager
- 実際に掴めるオブジェクトを置いてみる
- まとめ
- 参考文献
開発環境
Windows 10
Unity 2018.4.1f
Oculus Integration ver1.37
Oculus Quest
先行研究
セットアップ
前回の記事をあらかじめ見ておいてください。
前提として、Project内にAssetStoreからOculus Integrationをインポートしておく必要があります。
サンプルシーンの確認
Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
離れた物を掴むサンプルシーンはDistanceGrabになります。
学習や挙動の確認にとても有益です。見てみましょう。
実行してみるとこんな感じになります。
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を見てみましょう。
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から、範囲内のオブジェクトにアウトラインをつけることができます。
SphereColliderのRadiusの値を変えるだけで簡単に範囲を設定できます。
GrabManagerのスクリプト内ではCollider型で参照しているのでSphere以外のColliderも使うことができる・・・
かと思いきや、実はDistanceGrabberがSphereCollider型でGetComponentしているのでSphereしかだめみたいです。
実際に掴めるオブジェクトを置いてみる
まとめ
参考文献
Distance Grab Sample Now Available in Oculus Unity Sample Framework | Oculus
他間違っている箇所、不明な点、わかりにくい点がありましたらコメントにお願いします。