最近、UnityでVRの開発をはじめました。
「手(Oculus Touch)を使って、じぶんの好きなオブジェクトに触れたい…」
たったそれだけのことでしたが、そこそこ詰まったので、せっかくなので備忘録を残しておきます。
開発環境
- Oculus Rift S
- Oculus Touch
- Unity 2019.4.1f
- Oculus Integration 17.0
- Distance Graber
基本的な手順
Unityのインストール
まずはUnity 2019.4.1fをインストールします。他のバージョンでも動作するかもしれませんが、私はこちらを使っています。ちなみにUnityのバージョン管理のためにUnity Hubを使っています。
次に先ほどのバージョンで、Unityで新しいプロジェクトをつくります。
UnityにXRの設定
プロジェクト設定→Player→XR設定から、『VRサポートあり』にチェックをいれます。
Oculus Integrationの利用
アセットストアから、Oculus Integrationをダウンロードして、インポートします。Oculusの機能を使うために必要なアセットが詰まっています。
Oculus Integrationをインポートする際には、Unable to start Oculus XR Plugin.というエラーを避けるため、以下の記事の手順に従いました(私自身ははじめからこの手順を踏んだため、エラーに遭遇していません)。詳細は記事を確認してください。
サンプルシーンの確認
プロジェクトのAssets\Oculus\UsageにあるDistanceGrabのシーンで、特に手のインタラクションについて、どのようなことができるか確認できます。それぞれのオブジェクトやスクリプトの意味などの詳細は以下の公式サイトで紹介されています。
じぶんのプロジェクトへの導入
ポイントの確認
実際にじぶんのプロジェクトに手を召喚しましょう。
重要なのは、
- 視点:OVRPlayerController
- 左手:DistanceHandGrabLeft
- 右手:DistanceHandGrabRight
です。
この3点をDistanceGrabのシーンから、じぶんのシーン(なければ新規作成)にコピペしておきます。
左手と右手の初期設定
このとき、DistanceHandGrabLeftとDistanceHandGrabRightのParent TransformとPlayerが空の状態になっています。
Parent TransformにはOVRPlayerController/OVRCameraRig/TrackingSpaceのそれぞれLeftHandAnchorとRightHandAnchorを設定しておいてください。
また、PlayerにはともにOVRPlayerControllerを設定しておいてください。
この設定を忘れていると、以下の動画のように手が地面で這いずり回ることになります。
うわああああああああああああああ!!! pic.twitter.com/xYmfb3kQhq
— ぜー (@zhei_) June 27, 2020
もたれる側のオブジェクトの設定
どのようなオブジェクトでもいいので、もちたいオブジェクトを用意します。試しにキューブをつくりましょう。
もたれる側には以下の設定が必要と公式ドキュメントに記載されています。
- 任意のCollider
- Rigidbody
- DistanceGrabbable
キューブにははじめからBox Colliderがセットされているため、物理のRigidBodyとスクリプトのDistanceGrabbableをセットします。
もたれる側のオブジェクトのレイヤーに注意
ここで注意しないといけないことは、DistanceGrabHandLeftやDistanceGrabHandRightにとりつけているDistance Grabber (Script) で、つかむ対象のレイヤーを決めていることです。
私は『Grabbable』というレイヤーを追加して、そのレイヤー番号をGrab Objects in Layerにセットしました。
以上の設定で、以下の動画の通り、任意のオブジェクトをつかむことができます。私はかねてから待望の質点をつかむことができました…。
全国の質点好きのみんなが待望のやつができたぞ…。#できたできた pic.twitter.com/HZ3F9WJwff
— ぜー (@zhei_) June 28, 2020
空間の色の設定
先ほどの動画でお気づきの通り、空間が真っ暗な状態になっています。
これはOVRPlayerController/OVRCameraRig/CenterEyeAnchorでクリアフラグがソリッドカラーと背景が黒色になっているためです。
クリアフラグをスカイボックスに設定すると見慣れた背景を取り戻すことができます。
やっぱり質点は空の下で揺らしたいですよね。。。
やっぱり質点は空の下で揺らしたいよね。。。#できたできた pic.twitter.com/ghkuNXPqii
— ぜー (@zhei_) June 28, 2020
以上。ごくごく簡単に、Oculus Rift Sで手を使ってつかむ方法をまとめました。Questの場合はAndroidの設定などが必要なため、以下の記事を参考にしてください。
私は今回の作業をするにあたり、以下の記事を大枠で参考にさせていただきました(感謝です)。Questではなく、Rift Sである点、AvaterGrabではなく、DistanceGrabにした点が大きな違いになります。