Raspberlyのブログ

Raspberlyのブログ

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

【Oculus Quest開発メモ】掴めるオブジェクトにクロスヘアを表示する Grabbable Crosshair編【Unity】

 

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

 

前回はDistance GrabberとGrabbableで離れた場所にあるオブジェクトを掴みました。

しかしこれには欠点があります、それは掴もうとしているオブジェクトがどれなのかわからない問題です。

f:id:Raspberly:20190623125141g:plain

サンプルシーンでは、オブジェクトにアウトラインを付けることで解決していました。
しかしサンプルシーンにはもう一つ、
オブジェクトにクロスヘアをつける方法がありますのでこちらを解説していきます。

 

 

 

開発環境

Windows 10

Unity 2018.4.1f

Oculus Integration ver1.37

Oculus Quest

 

 

 

セットアップ

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

raspberly.hateblo.jp

 

 

サンプルシーンの確認

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

f:id:Raspberly:20190610220845p:plain

 

前回もこちらのサンプルシーンを使いましたが、今回注目すべきは右側のテーブルにあるキューブです。
こちらのキューブには予めクロスヘア機能が組み込まれています。

f:id:Raspberly:20190622010859p:plain

 

 

 

 

主要コンポーネント

今回もOculusに標準搭載されているコンポーネントを使用していきます。

GrabbableCrosshair

クロスヘアを表示するコンポーネントで、Grabbableの子オブジェクトにアタッチします。
有効化されたクロスヘアはUpdate内で常にプレイヤーの方を向き続けます

このクロスヘアに使用しているCrosshairZCheatシェーダーはオブジェクトの上にレンダリングされるように、プレイヤーに向かって少し移動しています。
ただし、オブジェクトサイズによっては機能しないこともあります。

 

 

Grabbable Crosshair

このコンポーネントがやっていることは至極単純、3つのステートを切り替えるだけです。

ステートはEnum型で定義されており、
・Disabled ターゲットクロスヘア、イネーブルクロスヘア共に無効化
・Enabled ターゲットクロスヘアを無効化、イネーブルクロスヘアを有効化
・Targeted ターゲットクロスヘアを有効化、イネーブルクロスヘアを無効化
に分かれます。

インスペクターパラメーター

f:id:Raspberly:20190622002548p:plain

Targeted Crosshair

 ターゲットクロスヘア、既に照準が合っていてすぐに掴める状態の時にActiveにするオブジェクト。

Enabled Crosshair

 イネーブルクロスヘア、掴むことができるオブジェクトだが、照準が合っていない状態の時にActiveにするオブジェクト。

 

これらのステートはDistanceGrabberが管理していますが、
何らかの理由で外部からステートを変えたい場合はSetState関数から設定することができます。
ただしGet関数はないので取得することはできません。必要な場合は自分で付け加えましょう。

 

 

 

 

 

 

 

 

実際にクロスヘアを表示してみる

それでは実際にクロスヘアを表示してみましょう。
前回の記事でユニティちゃんを置いた所の続きからやっていきます。 

まだの方はまずそちらからやってみてください。

raspberly.hateblo.jp

 用意できない場合は、サンプルシーンに置いてあるキューブを使ってみてください。

 

 

ユニティちゃんを格納しているゲームオブジェクトに新しく空のゲームゲームオブジェクトを子として追加します。
この子の名前を「Crosshair」とします。

f:id:Raspberly:20190621233855p:plain

Crosshairのインスペクターから、GrabbableCroshairコンポーネントをアタッチします。

f:id:Raspberly:20190622000338p:plain

 

TargetCrosshairの作成

ここまできたら次にクロスヘアオブジェクトを作っていきましょう。
Crosshairの子オブジェクトにCreateObjectからQuadを追加します。
このQuadの名前は「Targeted」にします。

f:id:Raspberly:20190622000704p:plain

f:id:Raspberly:20190622000943p:plain

するとユニティちゃんのモデルにQuadが重なる形で配置されると思います。

f:id:Raspberly:20190622000844p:plain

インスペクターを見てみましょう。

f:id:Raspberly:20190622001236p:plain

この中の内、MeshColliderは不要なのでRemoveComponentしておきましょう。

注目すべきはMeshRendererです。
ここのMaterialsを「TriangleCursorTargeted」に変更します。

f:id:Raspberly:20190622001451p:plain

するとクロスヘアが表示されます。

f:id:Raspberly:20190621233344p:plain

 

大きさを調整しましょう。
このままではクロスヘアがとても大きいのでスケールを調整します。

f:id:Raspberly:20190622003049p:plain

f:id:Raspberly:20190622003404p:plain

 

最終的なTargetedのインスペクターはこうなります。

f:id:Raspberly:20190622003745p:plain

 

 

EnableCrosshairの作成

基本的にターゲットとほとんど同じです。Duplicateで複製してから少しインスペクターをいじるだけです。
複製する場所はTargetedと同じCrosshairの子にします。
複製したら名前を「Untargeted」に変えておきましょう。

f:id:Raspberly:20190622004644p:plain

後はインスペクターのMeshRendererから、Materialsを「TriangleCursorUntargeted」に変えるだけです。

f:id:Raspberly:20190622004336p:plain

 

 

Grabbable Crosshairに登録

最後に親オブジェクトCrosshairにあるGrabbable Crosshairコンポーネントに、
先ほど作ったTargetCrosshairとEnableCrosshairを登録します。

f:id:Raspberly:20190622005001p:plain

これでクロスヘアは完成です。

 

 

 

動作確認

クロスヘアが常にカメラを向いているのがわかります。

f:id:Raspberly:20190622010247g:plain


また、手を向けて掴める状態になるとクロスヘアが変化することが確認できます。

f:id:Raspberly:20190622010331g:plain




 

 

まとめ

クロスヘアを表示するには、Grabbable Crosshairを使う

手っ取り早くクロスヘアを用意したいのであれば、
Assets/Oculus/SampleFramework/Udage/DistanceGrab/Prefabs/OutlineItemsの中にある
DistanceGrabCubeCrosshairを使うことをオススメします。

 

 

 

 

 

クロスヘアの演出追加

もう少しクロスヘアの演出を考えたい場合は独自スクリプトを組み込んでみましょう。

f:id:Raspberly:20190623125513g:plain

先ほど説明した通り、クロスヘアはアクティブ化、非アクティブ化で切り替えられています。
そのため、OnEnable()OnDisable()を記述したスクリプトを各クロスヘアにアタッチすることで
演出を簡単につけることができます。

 

一例として、上のGifにもある掴むことのできる範囲内に入ったオブジェクトに対して、
ウインドウをスケーリング表示するスクリプト

 

他には、Updateの中でRotateさせるといった演出もよくあります。

 

 

 

 

クロスヘアのアセット

今回使ったクロスヘアの素材はOculus側で用意されているクロスヘアです。
他にもアセットストアなどで「crosshair」や「hud」と検索すると、
類似の物がたくさんでてくるので探してみてください。

f:id:Raspberly:20190624095535p:plain

 

 


 

 

 

参考文献

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

 

 

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