今回はOculus Touchの開発ネタをやっていきます。
Oculus Quest及びOculus Rift Sで使える内容です。
過去にOVR GrabberとOVR Grabbableで物を掴んだり投げるところまでやりました。
しかし、これは1つのGrabbableしか掴むことができません。
なので小さい細々した物をまとめて掴むことができない難点があります。
そこで今回は、少し手を加えてこれを実現してみようと思います。
開発環境
Windows 10
Unity 2018.4.5f
Oculus Integration ver1.40
Oculus Quest
セットアップ
初めてVR開発をする方はこちらを参考にしてみてください
OVR Multi Grabberの準備
あらかじめGitHubから、OVRMultiGrabber.csをダウンロードしておきます。
アプローチ
複数の物をまとめて掴ませたい場合、GrabberとGrabbableどちらかを改造する必要がありますが。
今回はOVR Grabberを継承して独自クラスを実装していきます。
(OVR Grabberがアセット更新されていくことを考えるとできるだけ依存したくないため継承はしません)
ただし、「まとめて掴めるオブジェクト」と「まとめて掴ませたくないオブジェクト」の2つを共存させたい場合、少し面倒かもしれません。
動的に通常のOVR Grabberと切り替えたりする、またはGrabbable側にも手をつけたりする必要があります。
通常のOVRGrabberが範囲内のGrabbableを検索し、一番近いものを掴むのに対し、
MultiGrabberは範囲内のGrabbableを全て掴む処理を入れています。
主要コンポーネント
OVR Multi Grabber
物を掴む側、つまり手にアタッチするコンポーネントです。
サンプルシーンの確認
Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
学習や挙動の確認にとても有益です。見てみましょう。
今回はお馴染みAvaterGrabシーンを使っていきます。
【追記】 2020/02/18
AvatarGrabシーンが削除されました。詳しくはこちら。
実際にやってみる
Grabbableオブジェクトの準備
掴まれる側オブジェクトの準備。
準備といっても、Grabbableコンポーネントの変更はありません。
複数掴ませたいので小型のキューブを適当に複製しておきましょう。
Gerabber側の準備
予め用意しておいた、OVRMultiGrabberを手のオブジェクトにアタッチします。
(手とは、OVRGrabberやHandがアタッチされているオブジェクトです)
この時、OVRGrabberとOVRMultiGrabberは競合するので、OVRGrabberを非アクティブにしておきます。
OVRMultiGrabberのインスペクターパラメータ
ほとんどOVRGrabberと同じです。
GripTransformやGrabVolumeも同じように設定してあげましょう。
これで完成です。
使い道
パッと思いつくものですと、節分での豆まきくらいでしょうか。
しかし複数のオブジェクトを掴むVRを作品をあまり見ないような気がします。
もしかしたら需要がないのかも。。。
何かアイデアをお持ちの方はぜひお試しください!
課題点
現状掴んだオブジェクトを投げると、全て同じ方向に飛んでいきます。
これは見栄え的にはよろしくなく、掴んだオブジェクトはいい感じにバラけて飛んでもらいたいところです。
解決方法がわかる方はぜひPullRequestやブログのコメントなどに教えていただけると幸いです。
まとめ
・複数の物を掴むためにOVR MultiGrabberを作成しました。
・OVRGrabberの代わりにOVRMultiGrabberをアタッチするだけです。
・Grabbable側は特に変更ありません。
・現状投げる時の挙動に少し問題がある。
他間違っている箇所がありましたらコメントにお願いします。