今回はOculus Questの開発ネタをやっていきます。
内容的にはOculus Rift Sなどにもそのまま応用できるかと思います。
前回はDistance GrabberとGrabbableで離れた場所にあるオブジェクトを掴みました。
しかしこれには欠点があります、それは掴もうとしているオブジェクトがどれなのかわからない問題です。
サンプルシーンでは、オブジェクトにアウトラインを付けることで解決していました。
しかしサンプルシーンにはもう一つ、
オブジェクトにクロスヘアをつける方法がありますのでこちらを解説していきます。
- 開発環境
- セットアップ
- サンプルシーンの確認
- 主要コンポーネント
- Grabbable Crosshair
- 実際にクロスヘアを表示してみる
- 動作確認
- まとめ
- クロスヘアの演出追加
- クロスヘアのアセット
- 参考文献
開発環境
Windows 10
Unity 2018.4.1f
Oculus Integration ver1.37
Oculus Quest
セットアップ
この記事は前回の記事の補足になります。
まだ見ていない方はこちらからどうぞ
サンプルシーンの確認
Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
離れた物を掴むサンプルシーンはDistanceGrabになります。
学習や挙動の確認にとても有益です。見てみましょう。
前回もこちらのサンプルシーンを使いましたが、今回注目すべきは右側のテーブルにあるキューブです。
こちらのキューブには予めクロスヘア機能が組み込まれています。
主要コンポーネント
今回もOculusに標準搭載されているコンポーネントを使用していきます。
GrabbableCrosshair
クロスヘアを表示するコンポーネントで、Grabbableの子オブジェクトにアタッチします。
有効化されたクロスヘアはUpdate内で常にプレイヤーの方を向き続けます。
このクロスヘアに使用しているCrosshairZCheatシェーダーはオブジェクトの上にレンダリングされるように、プレイヤーに向かって少し移動しています。
ただし、オブジェクトサイズによっては機能しないこともあります。
Grabbable Crosshair
このコンポーネントがやっていることは至極単純、3つのステートを切り替えるだけです。
ステートはEnum型で定義されており、
・Disabled ターゲットクロスヘア、イネーブルクロスヘア共に無効化
・Enabled ターゲットクロスヘアを無効化、イネーブルクロスヘアを有効化
・Targeted ターゲットクロスヘアを有効化、イネーブルクロスヘアを無効化
に分かれます。
インスペクターパラメーター
Targeted Crosshair
ターゲットクロスヘア、既に照準が合っていてすぐに掴める状態の時にActiveにするオブジェクト。
Enabled Crosshair
イネーブルクロスヘア、掴むことができるオブジェクトだが、照準が合っていない状態の時にActiveにするオブジェクト。
これらのステートはDistanceGrabberが管理していますが、
何らかの理由で外部からステートを変えたい場合はSetState関数から設定することができます。
ただしGet関数はないので取得することはできません。必要な場合は自分で付け加えましょう。
実際にクロスヘアを表示してみる
それでは実際にクロスヘアを表示してみましょう。
前回の記事でユニティちゃんを置いた所の続きからやっていきます。
まだの方はまずそちらからやってみてください。
用意できない場合は、サンプルシーンに置いてあるキューブを使ってみてください。
ユニティちゃんを格納しているゲームオブジェクトに新しく空のゲームゲームオブジェクトを子として追加します。
この子の名前を「Crosshair」とします。
Crosshairのインスペクターから、GrabbableCroshairコンポーネントをアタッチします。
TargetCrosshairの作成
ここまできたら次にクロスヘアオブジェクトを作っていきましょう。
Crosshairの子オブジェクトにCreateObjectからQuadを追加します。
このQuadの名前は「Targeted」にします。
するとユニティちゃんのモデルにQuadが重なる形で配置されると思います。
インスペクターを見てみましょう。
この中の内、MeshColliderは不要なのでRemoveComponentしておきましょう。
注目すべきはMeshRendererです。
ここのMaterialsを「TriangleCursorTargeted」に変更します。
するとクロスヘアが表示されます。
大きさを調整しましょう。
このままではクロスヘアがとても大きいのでスケールを調整します。
最終的なTargetedのインスペクターはこうなります。
EnableCrosshairの作成
基本的にターゲットとほとんど同じです。Duplicateで複製してから少しインスペクターをいじるだけです。
複製する場所はTargetedと同じCrosshairの子にします。
複製したら名前を「Untargeted」に変えておきましょう。
後はインスペクターのMeshRendererから、Materialsを「TriangleCursorUntargeted」に変えるだけです。
Grabbable Crosshairに登録
最後に親オブジェクトCrosshairにあるGrabbable Crosshairコンポーネントに、
先ほど作ったTargetCrosshairとEnableCrosshairを登録します。
これでクロスヘアは完成です。
動作確認
クロスヘアが常にカメラを向いているのがわかります。
また、手を向けて掴める状態になるとクロスヘアが変化することが確認できます。
まとめ
クロスヘアを表示するには、Grabbable Crosshairを使う
手っ取り早くクロスヘアを用意したいのであれば、
Assets/Oculus/SampleFramework/Udage/DistanceGrab/Prefabs/OutlineItemsの中にある
DistanceGrabCubeCrosshairを使うことをオススメします。
クロスヘアの演出追加
もう少しクロスヘアの演出を考えたい場合は独自スクリプトを組み込んでみましょう。
先ほど説明した通り、クロスヘアはアクティブ化、非アクティブ化で切り替えられています。
そのため、OnEnable()とOnDisable()を記述したスクリプトを各クロスヘアにアタッチすることで
演出を簡単につけることができます。
一例として、上のGifにもある掴むことのできる範囲内に入ったオブジェクトに対して、
ウインドウをスケーリング表示するスクリプト。
他には、Updateの中でRotateさせるといった演出もよくあります。
クロスヘアのアセット
今回使ったクロスヘアの素材はOculus側で用意されているクロスヘアです。
他にもアセットストアなどで「crosshair」や「hud」と検索すると、
類似の物がたくさんでてくるので探してみてください。
参考文献
Distance Grab Sample Now Available in Oculus Unity Sample Framework | Oculus
他間違っている箇所、不明な点、わかりにくい点がありましたらコメントにお願いします。