Unity + Oculus Integrationを使ってコントローラやハンドトラッキングでボタンを押すまでの手順をStep by stepで説明します。
やっていることはOculus Integrationのサンプルシーン「PokeExamples」と同様ですが、これを0から組み立ててみてSceneを構成するコンポーネントの役割への理解を深めようという趣旨の記事です。
ボタンを押す動作はOculus IntegrationのPoke Interaction | Oculus Developersという機能を使って実装します。
Pokeには「つつく」という意味があります。
以下のステップで実装を進めていきます。
- 無地のボタンの作成(本記事)
- ボタンの大きさ・高さの調整
- ラベル付きボタンの作成
- 好きな形のボタンを作成
- Canvas上にボタンを作成
2022/11/7: githubにプロジェクトを共有しました。
github.com
環境構築・プロジェクト作成
環境構築とプロジェクト作成の手順については、こちらの記事を参照してください。
利用するコンポーネント
今回の記事で新たに使用するコンポーネントは以下の通りです。
HandPokeInteractor
Pokeする側(Hands, ControllerHands)に追加するprefabです。
コントローラー(コントローラの位置にコントローラを表示)でPokeする場合はHandPokeInteractorではなくControllerPokeInteractorを使います。
HandPokeInteractor (HandRef, PokeInteractor, ActiveStateTracker) +- HandIndexFingertip (HandJoint) +- Visuals +- HandPokeLimiter (HandPokeLimiterVisual)
HandPokeLimiter (HandPokeLimiterVisual)
指でボタンを押した(押しすぎた)ときに、指がボタンを突き抜けてしまわないように手のビジュアルを調整するコンポーネントです。
物をつかむときにも、指がオブジェクトにめり込まないように手のビジュアルを調整するHandGrabVisualというコンポーネントが使われていましたが、それのPoke版です。
PokeInteractable
Pokeされる側に追加するprefabです。
PokeInteractable (PokeInteractable) +- Model | +- Surface (PointablePlane) | +- BoxProximityField (BoxProximityField) +- Visuals +- ButtonVisual (PokeInteractableVisual, QuadMesh(MeshFilter), MeshRenderer, MaterialPropertyBlockEditor, RoundedBoxProperties, InteractableColorVisual)
今回はこのprefabをそのまま使うため、prefabを構成する各コンポーネントについての深入りはしません。
Scene構築手順
手を表示する
空のシーンを作成します。(Assets/Sandbox/HandPoke/Scenes/PokeScene0)
途中までは以下の記事のScene2と同様に進めます。
(Scene2が作成済みならコピーしてリネームすれば良いです)
Pokeする側の設定
Pokeする側(コントローラやハンドトラッキング)の設定をします。
コントローラの設定
コントローラでPokeできるように設定していきます。
※コントローラを使用しない場合は、この手順はスキップしても構いません。
HandPokeInteractorの追加
InteractionRigOVR/InputOVR/ControllerHands/LeftControllerHand/ControllerHandInteractors配下に「Oculus/Interaction/Runtime/Prefabs/HandPokeInteractor」のprefabを配置します。
HandPokeInteractorのコンポーネントHandRefにInteractionRigOVR/InputOVR/ControllerHands/LeftControllerHandを設定します。
InteractionRigOVR/InputOVR/ControllerHands/LeftControllerHand/ControllerHandInteractorsのコンポーネントInteractorGroupのInteractorsにHandPokeInteractorを追加します。
※Right側も同様の手順で設定します。
HandPokeLimiterの設定
HandPokeLimiterの設定を行います。
この設定を行うことで、ボタンをつついたときに、指がボタンを貫通してしまわないように手のVisualを調整できるようになります。
詳細は以下を参照してください。
Poke Interaction | Oculus Developers
HandPokeInteractor/Visuals/HandPokeLimiterをアクティブにします。
HandPokeLimiterのコンポーネントHandPokeLimiterVisualのSyntheticHandにInteractionRigOVR/InputOVR/ControllerHands/LeftControllerHand/LeftHandSyntheticを設定します。
ハンドトラッキングの設定
ハンドトラッキングでPokeできるように設定していきます。
※ハンドトラッキングを使用しない場合は、この手順はスキップしても構いません。
HandPokeInteractorの追加
InteractionRigOVR/InputOVR/Hands/LeftHand/HandInteractorsLeft配下に「Oculus/Interaction/Runtime/Prefabs/HandPokeInteractor」のprefabを配置します。
HandPokeInteractorのコンポーネントHandRefにInteractionRigOVR/InputOVR/Hands/LeftHandを設定します。
InteractionRigOVR/InputOVR/Hands/LeftHand/HandInteractorsLeftのコンポーネントInteractorGroupのInteractorsにHandPokeInteractorを追加します。
※Right側も同様の手順で設定します。
HandPokeLimiterの設定
HandPokeLimiterの設定を行います。この設定を行うことで、ボタンをつついたときに、指がボタンを貫通してしまわないように手のVisualを調整できるようになります。
詳細は以下を参照してください。
Poke Interaction | Oculus Developers
HandPokeInteractor/Visuals/HandPokeLimiterをアクティブにします。
HandPokeLimiterのコンポーネントHandPokeLimiterVisualのSyntheticHandにInteractionRigOVR/InputOVR/Hands/LeftHand/LeftHandSyntheticを設定します。
InteractionRigOVR/InputOVR/Hands/LeftHand/LeftHandVisualを非アクティブにします。
※Right側も同様の手順で設定します。
Pokeされる側の設定
Pokeされる側の設定をします。
無地のボタンの配置
ラベルがない角丸の形のボタンを作ってみます。
これは「Assets/Oculus/Interaction/Runtime/Prefabs/Poke/PokeInteractable」のprefabを配置するだけで完了です。
prefabのボタンはどこに置いても良いですが本記事ではInteractables/Buttonsの階層を作ってその下に置くことにします。
[SceneRoot] +- Interactables +- Buttons +- PokeInteractable
動作確認
実行するとボタンを指(手のひらや握りこぶしでもOK)やコントローラで押せるようになります。
参考サイト
公式:Oculusスタートガイド(Unity)
Get Started with Oculus in Unity | Oculus Developers
公式:入力データの概要
※サンプルシーンのInteractionRigOVR~prefab配下のコンポーネント群が何をやっているのか、ざっくり理解するための最適なドキュメントだと思います。
Input Data Overview | Oculus Developers