【Vroom SDK】5230円で構築したオレオレVR開発環境が割とよかった話

# TL;DR

スマホVRアプリ開発するにあたって、VroomSDKがイイ感じだった

# 発端

　先日秋葉原のヨドバシにふらっと遊びに行きました。別の商品が目当てだったのですが、割と高くつきそうだったので断念し、落ち込みながら2階でぶらぶら回っているとVR商品が並ぶコーナーに来ました。やはり昨今のVR人気のせいか、いろいろなVRゴーグルが売ってましたね。

　私はVR開発をしているとはいえ、全然お金がないせいでGoogle Cardboard(しかもNEXUSを買ったときに無料でついてきたやつ)を4年ほど使っていました。まぁ全然使えるんですけど、VRゴーグルに憧れはありましたし、せっかくなのでどれか購入することに決めました。

　そんなさなか、目に飛び込んできたのが「Vroomコントローラー」というスマホ用のゲームコントローラでした([製品情報はこちら](https://www.elecom.co.jp/products/JC-VRR02VBK.html))。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86191/a9ef54a2-594f-050e-8917-d168ae3ce1cc.png)
スマホ用ゲームコントローラというといわゆるゲームパッドのようなものが多いので、「へぇ～こんなもの売ってるのか」と思い手に取るとなんと**Unity用のSDKが配布されている**との記載がありました。それを見た瞬間「これ...スタンドアロンVRで使えるのでは...」と考えを巡らせ、手元のスマホで確かめると、確かにSDKの配布とリファレンスが見つかりました。
そこからの記憶はあいまいですが、気づいたらレジに並んでいました(ゴーグルも買いました)。

### 結局買ったもの

- ヴルームSDK対応コントローラ
- [スマホ用VRゴーグル](https://www.sanwa.co.jp/product/syohin.asp?code=MED-VRG1)(安いし軽くて着け心地がよかったので)


しめて5230円！

帰りの電車の中で「OculusGOにどこまで対抗できるか勝負してやる！」と誓いましたとさ。

# 環境について

今回の記事で前提とする環境を下に記します。

- 開発機：Windows 10
- CPU: Corei7-4700MQ
- **Unity 2017(ここ重要)**
    - Vroom SDK 2.23
    - Google VR For Unity 1.190.1
- IDE：Visual Studio 2019
- 実機：nexus 5X android 8.1

# 使ってみる

　まず準備として、[こちらのページ](https://vroom.wonderleague.co.jp/sdk/download/)からVroom SDKをダウンロードしておきましょう。いろいろ聞かれますが、個人利用であればそんなに情報量がないのでサクッと記入していきます。ついでに[リファレンス](https://vroom.wonderleague.co.jp/sdk/docs/vroom-sdk-reference-v233.pdf)もダウンロードしておくとよいです。

　次にUnityのプロジェクトを作成します。ここで注意してほしいのが、**VroomSDKがUnity5系かUnity2017にしか対応していないという点です(2019年4月現在)**。ドキュメントが古いのか、サイトにはUnity5以上という風に記載されているので大丈夫かと思っていましたが、私の環境ではビルドが通ってもコントローラの情報が取得できませんでした(これがわかるまで割と時間溶かしてしまった)。何が原因なのでしょうか...有識者のお方教えてくださると嬉しいです。

ということで今回はUnity2017を使っていきます。

# VroomSDKをUnityプロジェクトに導入する

　Unity2017のプロジェクトをこんな風に設定して「Create Project」を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86191/0ea47935-4f25-5886-ac42-fc391b3ff7d4.png)
バージョンを変えたりするのにはUnityHubが便利なので、使ってない方はぜひ使ってみてください。

VroomSDK自体が.unitypackageファイルとして提供されているので、プロジェクトを開いた状態でそれをダブルクリックすればインポートされます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86191/d4292fcd-5763-db0c-561a-aa3e5a6e8fc6.png)
処理が終わると、Assets配下に「Vroom」というディレクトリが作られているのが確認できるかと思いますので、その中身を見てみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86191/9a13a4cc-ca19-1512-f7a8-1c0cb67e3b6a.png)

雑ですが紹介すると、

- Assets/Vroom/Demo/Controller/Scenes　の中のControllerDemoというSceneでDemoのプロジェクトが実行できる
- Assets/Vroom/Prefab の中に**VvrController**というプレハブがある

って感じですね～

VroomSDKは基本的に**VvrController**というクラスを使ってAPIを呼び出します。

## VvrControllerを使ってみる

　実際リファレンスやDemoのコードを見れば一目瞭然なのですが、VroomSDKの機能を利用するためにはVvrControllerプレハブをSceneに読み込むだけですぐ使えるようになります。
VvrControllerプレハブにアタッチされているスクリプト内のVvrcontrollerというシングルトンがDontDestroyOnLoadでインスタンス化されるというUnityのSDKではよく見る形ですね。

ではプロジェクトを作りこんでいきます。コントローラの回転をCubeに反映するアプリを作りましょう。
sceneをテキトーな名前で作成し、VvrControllerプレハブと平べったいCubeオブジェクト、テキストオブジェクトをscene中に作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86191/7d9e9f48-e81b-befd-f071-18885cc90e33.png)
Cubeの名前は「virtual controller」としました。

次にvirtual controllerにスクリプトをアタッチしましょう。

スクリプトの中身はこんな感じ

```cs:VirtualController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.UI; // 追加

public class VirtualController : MonoBehaviour {
    [SerializeField] Text TriggerText; // 追加

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        // ここから2行追加
        transform.rotation = VvrController.Orientation();
        TriggerText.text = VvrController.Trigger().ToString();
	}
}
```

そして、Sceneをイイ感じにします(丸投げ)。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86191/b4d6771c-4280-9d14-34e7-8ff8c249766c.png)

## プロジェクトをAndroidにビルドする

それでは実機にビルドします。
まず```ctrl+shift+B```でビルドセッティングを開き、AndroidにSwitch Platformします。
VroomSDKはAndroid5.0以上に対応しているので、```PlayerSetting```→```OtherSetting```の```MinimamAPILevel```を```Android 5.0 'Lollipop'```にします。ここまで出来たらビルドしてみましょう！

## Android でヴルームSDK対応コントローラを使う

　スマホでコントローラを使うためにはBluetoothをオンに、コントローラの電源をオンにする必要があります。それで対応するアプリを開けば自動でアプリがコントローラに接続してくれるみたいです。

　これは設定からManualモードにしてスクリプト上で```ConnectionRequest```を送ることもできますが、デフォルトでは何もしなくても大丈夫です。もし、コントローラの電源を入れ忘れていると、20秒後に接続がタイムアウトしてしまうので気を付けましょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/86191/64d3a3be-e984-df92-555b-2f5d0c8d6c2b.gif" width=50%>

## GoogleVRの導入

次にGoogleVRをプロジェクトに導入していきます。これによってVRゴーグルで見るような2眼VRアプリが作成可能になります。

GoogleVRは[こちら](https://github.com/googlevr/gvr-unity-sdk/releases)からダウンロードしてください。これもプロジェクトを開いた状態でダブルクリックしてインポートします。

GoogleVRの使い方自体は結構更新が早いので、この記事だけを参考にするのではなく、[公式ドキュメント](https://developers.google.com/vr/develop/unity/get-started-android)などを参照されるのがいいと思います。現状だと、以下のようにSceneにプレハブをインスタンス化してあげます。プレハブはAssets/GoogleVR/Prefab 配下にいろいろあります。ポイントはEmptyObject(今回はPlayerという名前にしてある)にMainCameraとGvrControllerMainを子オブジェクトとして設置することです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86191/681a5602-c917-744c-60df-ee853f6d3d2d.png)

Android用にビルドするためにはPlayerSetting→XR Settingsから```Virtual Reality Supported```にチェックを入れ、Cardboardを選択します。

![キー多用キャプチャに.gif](https://qiita-image-store.s3.amazonaws.com/0/86191/5c1a3259-a985-3cf2-2a51-7401e9ad483c.gif)

# 最後に

今回は衝動買いした結果いい勉強になりました。VroomSDKについての文献は実際調べてみると全然少ないので、ほぼリファレンスのみを参照しての開発でしたが、結構楽しかったです。

結局OculusGoに勝てたかはビミョーなとこですが、簡単なスマホVRを作りたいと思ったときに使って行こうと思います。

そして願わくば、皆さんに少しでも参考になれば嬉しいです。
最後まで読んでいただきありがとうございました。

そういえばこのコントローラ6DoFらしいけど、加速度積分して移動を求めるってことなのかな