プログマのプログラマ日記

技術メモや自社サービスに関する記事を書いていく予定です。

Unity + Oculus Integrationでボタンを押す(その1:無地のボタン)

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

環境構築・プロジェクト作成

環境構築とプロジェクト作成の手順については、こちらの記事を参照してください。

rhikos-prgm.hatenablog.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が作成済みならコピーしてリネームすれば良いです)

rhikos-prgm.hatenablog.com

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

公式:APIリファレンス
Reference