【Unity】Oculus Questで車を走らせるまで【プログラミング】

2020年1月9日

この記事は、

「Oculus Quest買った、Unity(UnityHub)入れた、この後どうすんの?」

という人向けに書いています。

この記事は、

  • Unityバージョン2019.2.17f1
  • Oculus Questヘッドセットバージョン434260.5710.0
  • Unity Hubを利用

の環境を前提に書いています。

全体の流れ

知り合いに記事を見せたら「長いよっ!」って言われちゃったので、簡単な流れを書いておきます。

画像が多いので量が多く感じるかもしれませんが、やってる事はそんなに多くないですよ~

1)Oculus Questを開発モードにする。(Webサイトでの登録がちとメンドイかも)

2)UnityにAndroidビルド用のモジュールを追加する

3)新規プロジェクトでサンプルアプリを作る

4)プラットフォームをAndroid用に切り替えて、VRビルド用のセッティングを行う

5)Oculus用のアセットをインポートする

6)コントローラーで車を動かせるように、ちょこっとソースをいじる

7)完成

こんな感じです。

ね、簡単でしょう?

Oculus Quest側の準備

まず、Oculus Questの開発者モードを有効にして、USBでPCに繋ぎます。

1)スマホにOculus アプリをインストールする

2)Oculus Questとペアリングする

3)ペアリングしたヘッドセットの設定で「開発モード」を「有効」にする

開発モードにする時、初回のみ登録が必要だったはず。
こちらのページを参考に登録してみて。

4)USBケーブルでPCに接続する

これも初回のみですが、Quest側に「接続を許可しますか?」みたいなメッセージが出ます。
忘れずに許可しといて下さい。

100円ショップの安いケーブルだと認識しない時があります。
上手く認識しない時はケーブルを変えて試してみて下さい。

Unity Hubでの準備

UnityにAndroid開発用のモジュールを加えます。

1)Unity Hubの「インストール」画面で、利用するUnityにドロイドマークがない事を確認する。(ある場合は作業の必要なし)

2)バージョン番号右上のメニューボタンから「モジュールを加える」を選ぶ

ドロイド君の足が見えているのは気にしちゃダメです。

3)「Android Build Support」モジュールにチェックを入れて「実行」

ごめんなさい、モジュール入れる前をキャプチャするの忘れました。
と言うか、Unityインストールと同時にモジュール入れちゃいました・・・

4)各利用規約に同意してインストールする

5)利用するUnityにドロイドマークが付いた事を確認する。

とりあえずテスト用のアプリを作ってみる

ちゃんと動くサンプルアプリを作ります。

この記事では、こちらの車を動かすサンプルを前提に解説します。

PLAYボタンでエラー無く動くことを確認しておいて下さい。

Oculus Quest用のビルドセッティング

いよいよ本題です。
新しいプロジェクトを作るたびに行う作業なので、忘れたら見返して下さい。

1)「File」の「Build Settings」を開く

2)「Android」を選択

3)「Switch Platfome」をクリック

4)左下の「Player Settings」をクリック

5)「Project Settings」タブの「Player」で「othre Settings」を開く

と言うか、上の 「Player Settings」 押したら自動で開くはず。

6)「Minimum API Level」を「API Level 19」に設定
※アプリを公開する場合は「Package Name」も変更します。(今回はお試しなのでデフォルト)

7)「XR Settings」を開く

8)「Virtual Reality Supported」をチェック

9)「+」を押して「Oculus」を追加

「XR is currently not supported when using the Vulkan Graphics API.」のワーニングが出ている場合は、「othre Settings」の設定に戻って「Auto Graphics API」にチェックを入れます。

とりあえずビルドしてみる

上の項目の設定をする事でプロジェクトのビルドと、Questへの転送が出来る状態になります。

試しにビルドしてみましょう。

1)「File」の「Build And Ran」をクリック

2)初回のみapkファイル名の設定があります。

プロジェクト名と同じでで良いと思います。

上手くビルド(転送)出来ない時

以下の点を確認してみて下さい。

USBのケーブルは繋がっているか?

100円ショップの安いケーブルだと上手く転送できない場合があります。
ケーブルを変えてみて下さい。

Questが開発モードになっているか?

Questのアップデート後に開発モードがOFFになってしまう事がありました。(数時間悩んだ)
スマホのOculusアプリで、こまめに確認しましょう。

ドライバが正しく認識されているか

adbドライバ周りでハマりました・・・
デバイスマネージャで正しく認識されているか確認しましょう。

Quest側の古いアプリが邪魔していないか

時々、Quest側に転送した古いアプリが邪魔をして転送できない場合があります。
Quest側のアプリを削除しましょう。

adb shell pm list package でパッケージを検索

adb shell pm uninstall でパッケージを削除

例: (Package Name がデフォルトの場合です)

PS C:\Users\ikaken> adb shell pm list package | Select-String DefaultCompany
package:com.DefaultCompany.car
package:com.DefaultCompany.tsukamu
PS C:\Users\ikaken> adb shell pm uninstall com.DefaultCompany.tsukamu
Success
PS C:\Users\ikaken>

Oculus用アセット「Oculus Integration」をインポート

ビルドと転送を確認したら、Oculusで使う諸々の機能が入ったアセット「Oculus Integration」をアセットストアからインポートします。

1)「Window」メニューから「Aseet Store」を開く

2)「アセットの検索」で「Oculus Integration」を検索

私はすでにダウンロード済みなので灰色で表示されています。

3)「Oculus Integration」を選んで、「ダウンロード」

私はすでにダウンロード済みなので、ダウンロードの画面は無いのです。

4)「ダウンロード」が終わったら「インポート」

5)インポートウインドが開くので、何も考えずに「Import」ボタンをクリック

なんか色々メッセージが出ますが、気にせず進みます。

インポートが終わるとUnityが再起動されます。

Oculus Touchコントローラーで車を動かす

ここから、Oculus Quest標準のOculus Touchコントローラーで車を動かす機能を実装していきます。

1)「Assets」の「Oculus」「VR」Prefabs」の中の「OVRCameraRig」を「Hierarchy」へ追加

コントローラーで車を動かすだけであれば、carオブジェクトにOVRManagerのインスタンスを追加するだけで良いのですが、あとあと便利なのでOVRCameraRigを入れちゃいます。

2)「Hierarchy」の「Main Camera」を削除

OVRCameraRig が優先されるので、 Main Camera は使いません。

3)「OVRCameraRig」の位置を調整

斜め上から俯瞰する感じがお勧め。

4)「car」オブジェクトの「Car User Control (Script)」の「CarUserControl.cs」を編集

スクリプト名をダブルクリックでエディタが立ち上がります。

CarUserControl.cs内の「FixedUpdate()」の中を以下の様に修正します。
(修正したら保存)

        private void FixedUpdate()
        {
            // pass the input to the car!
            //float h = CrossPlatformInputManager.GetAxis("Horizontal");
            //float v = CrossPlatformInputManager.GetAxis("Vertical");
            
            // 左コントローラーのスティックの情報を取得
            Vector2 PrimaryThumbstick = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick);
            
            // 右コントローラーのトリガーの情報を取得
            float SecondaryIndexTrigger = OVRInput.Get(OVRInput.Axis1D.SecondaryIndexTrigger);
            // 左コントローラーのトリガーの情報を取得
            float PrimaryIndexTrigger = OVRInput.Get(OVRInput.Axis1D.PrimaryIndexTrigger);
            
            float h = PrimaryThumbstick.x;  // 左スティックの左右がハンドル
            //float v = SecondaryThumbstick.y;
            float v = SecondaryIndexTrigger - PrimaryIndexTrigger;  // 右トリガがアクセル、左トリガがブレーキ(後退)
            
#if !MOBILE_INPUT
            float handbrake = CrossPlatformInputManager.GetAxis("Jump");
            m_Car.Move(h, v, v, handbrake);
#else
            m_Car.Move(h, v, v, 0f);
#endif
        }

コントローラーが使いづらい場合は適当に改造して下さい。(追記参照

5)ビルド

完成

Questをかぶると車が目の前にあると思います。

車の画面になっていない場合や、もう一度アプリを実行したい場合は、

「ライブラリ」の「提供元不明のアプリ」から起動して下さい。

右手のトリガを握ると車が走り出します。

左手のスティックの左右で曲がります。

左手のトリガがブレーキ(バック)です。

VR空間では暴走しても誰の迷惑にもならないので、気が済むまで遊んでくださいw

では、良いVRライフを。

追記:改造

「コントローラーが使いづらいよ!」
と、言う方のために、コントローラーの情報取得方法をご紹介します。
詳細は、Touch Input Mapping(英語) を見てね。

// 左コントローラーのスティック
OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick);

// 右コントローラーのスティック
OVRInput.Get(OVRInput.Axis2D.SecondaryThumbstick);

// 左コントローラーの人差し指トリガー
OVRInput.Get(OVRInput.Axis1D.PrimaryIndexTrigger);

// 右コントローラーの人差し指トリガー
OVRInput.Get(OVRInput.Axis1D.SecondaryIndexTrigger);

// 左コントローラーの中指トリガー
OVRInput.Get(OVRInput.Axis1D.PrimaryHandTrigger );

// 右コントローラーの中指トリガー
OVRInput.Get(OVRInput.Axis1D.SecondaryHandTrigger );

// 右コントローラーのAボタン
OVRInput.Get(OVRInput.Button.One);

// 右コントローラーのBボタン
OVRInput.Get(OVRInput.Button.Two);

// 左コントローラーのXボタン
OVRInput.Get(OVRInput.Button.Three);

// 左コントローラーのYボタン
OVRInput.Get(OVRInput.Button.Four);