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

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

Unity + Oculus Integrationで物をつかむ(その4:オブジェクトをつかむ)

Unity + Oculus Integrationを使ってコントローラやハンドトラッキングでオブジェクトをつかむまでの手順をStep by stepで説明します。
やっていることはOculus Integrationのサンプルシーン「HandGrabExamples」と同様ですが、これを0から組み立ててみてSceneを構成するコンポーネントの役割への理解を深めようという趣旨の記事です。

以下のステップで実装を進めていきます。

  • ルームスケールで動き回れるSceneを作成する手順
  • コントローラを表示できるようにする手順
  • 手を表示できるようにする手順
  • オブジェクトをつかめるようにする手順(本記事)
  • オブジェクトをつかむときのポーズ(つかむ場所・手の形)を設定する手順

2022/11/7: githubにプロジェクトを共有しました。
github.com

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

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

rhikos-prgm.hatenablog.com

利用するコンポーネント

今回の記事で新たに使用するコンポーネントは以下の通りです。

HandGrabInteractor

つかむ側(Hands, ControllerHands, Controllers)に追加して、オブジェクトをつかむことができるようにするprefabです。

HandGrabInteractor
 +- HandGrabAPI
 +- Rigidbody
 +- PinchArea
 +- Visuals
       +- HandGrabVisual

詳細は下記を参照。
Hand Grab | Oculus Developers

Grabbable

つかまれる側に追加するスクリプトです。

詳細は下記を参照。
Grabbable | Oculus Developers

PointableUnityEventWrapper

オブジェクトをつかんだとき・離したときなどのイベントを処理するために追加するスクリプトです。
本記事では物をつかんだとき・離したときに音を鳴らすために使います。
公式ドキュメント(下記)には色々なイベントラッパーの説明が載っていますがPointableUnityEventWrapperについての記述はありませんでした。

Event Wrappers | Oculus Developers

Sceneの実装手順

Sceneの作成

空のシーンを作成します。(Assets/Sandbox/HandGrab/Scenes/Scene3)
途中までは前の記事のScene2と同様に進めます。
(Scene2が作成済みならコピーしてリネームすれば良いです)

Roomの作成

床とテーブルの配置

まずはつかむことができないオブジェクトを配置してみます。
何でもよいのですが、本記事ではその1で作成したScene0と同様にfloorとtableのみを配置します。

つかむことができるオブジェクトの配置

Interactables配下につかむことができるオブジェクトを配置します。
Interactables配下に以下のツリー構造のオブジェクトを作成します。

Interactables
 +- [つかめるオブジェクトの名前(任意)]   ... 1
     +- Visuals              ... 2
     |   +- Root             ... 3
     |       +- [メッシュ]    ... 4
     +- HandGrabInteractable ... 5

1にRigidbody、Grabbableのスクリプトを追加します。
3配下にオブジェクトの形状を追加します。
5にHandGrabInteractableとのスクリプトを追加します。
HandGrabInteractableのRigidbodyに1を設定されていることを確認します。(設定されていない場合、手動で設定します)

オブジェクトの名前や形状は何でもよいですが、本記事では「GrababbleCapsule」の名前でカプセル形状のオブジェクトを作成しました。

このようにして作成したGrabbableCapsuleをtableの上に配置します。

コントローラでオブジェクトをつかめるようにする

コントローラでオブジェクトをつかめるようにしていきます。
※コントローラを使用しない場合は、この手順はスキップしても構いません。

HandGrabInteractorの追加・設定

InteractionRigOVR/InputOVR/ControllerHands/LeftControllerHand/ControllerHandInteractors配下に「Oculus/Interaction/Runtime/Prefabs/HandgrabInteractor」のprefabを配置します。
HandgrabInteractorのコンポーネントHandRefのHandに「InteractionRigOVR/InputOVR/ControllerHands/LeftControllerHand」を設定します。
InteractionRigOVR/InputOVR/ControllerHands/LeftControllerHand/ControllerHandInteractorsのコンポーネントInteractorGroupのInteractorsにHandgrabInteractorを追加します。
※Right側も同様の手順で設定します。

ハンドトラッキングでオブジェクトをつかめるようにする

ハンドトラッキングでオブジェクトをつかめるようにしていきます。
※ハンドトラッキングを使用しない場合は、この手順はスキップしても構いません。

HandGrabInteractorの追加・設定

InteractionRigOVR/InputOVR/Hands/LeftHand/HandInteractorsLeft配下に「Oculus/Interaction/Runtime/Prefabs/HandgrabInteractor」を配置します。
HandgrabInteractorのコンポーネントHandRefのHandに「InteractionRigOVR/InputOVR/Hands/LeftHand」を設定します。
InteractionRigOVR/InputOVR/Hands/LeftHand/HandInteractorsLeftのコンポーネントInteractorGroupのInteractorsにHandgrabInteractorを追加します。
※Right側も同様の手順で設定します。

オブジェクトをつかんだとき・離したときに音が鳴るようにする

オブジェクトをつかむんだとき・離したときに音が鳴るようにします。
※必要なければ、この手順はスキップしても構いません。

Audioの追加

つかめるオブジェクト配下に、以下のようにAudioを追加します。

Interactables
 +- [つかめるオブジェクトの名前(任意)] ... 1
     +- Visuals              
     |   +- Root             
     |       +- [メッシュ]    
     +- HandGrabInteractable
     +- Audio    <- 追加
         +- Pickup ... 2
         +- Release ... 3

2, 3にAudioSourceのスクリプトを追加します。「Play On Awake」のチェックは外します。
2, 3にそれぞれ、つかんだ時・離したときのサウンドを設定します。
どんな音でもよいのですが、本記事ではOculus Interactionのサンプルに付属している、以下のサウンドを設定しています。
2 ... 「Assets/Oculus/Interaction/Samples/Sounds/GrabObject01」
3 ... 「Assets/Oculus/Interaction/Samples/Sounds/DropObject01」

PointableUnityEventWrapperの追加・設定

1にPontableUnityEventWrapperのスクリプトを追加します。
PontableUnityEventWrapperのPointableに1を設定します。
PontableUnityEventWrapperのWhenSelectにBasicGrabPickupAudioを追加します。
(FunctionはAudioSource.Playを選択してRuntime Onlyとします。)
PontableUnityEventWrapperのUnSelectにBasicGrabReleaseAudioを追加します。
(FunctionはAudioSource.Playを選択してRuntime Onlyとします。)

動作確認

実行するとオブジェクトをつかむことができるようになります。

参考サイト

公式:Oculusスタートガイド(Unity)
Get Started with Oculus in Unity | Oculus Developers

公式:入力データの概要
※サンプルシーンのInteractionRigOVR~prefab配下のコンポーネント群が何をやっているのか、ざっくり理解するための最適なドキュメントだと思います。
Inputs | Oculus Developers

公式:APIリファレンス
Reference