FirstVRで遊ぶ チュートリアル編

#はじめに FirstVRとは

[FirstVR](https://first-vr.com/)とは、H2L社さんが開発・販売されている**筋変位を使ったコントローラ**付属のVRデバイスです。
腕に専用のデバイスを装着し、筋肉の動きを測定することで手や腕の動きをコントローラ入力にしてしまおうという結構画期的なデバイスです。

現在、VRで指や腕の動きを取ろうとするとナックルコントローラや大掛かりなモーションキャプチャースーツが必要でした。
このFirstVRなら腕に専用のセンサを巻くだけで指の動きが取れるようになるため、VRゲーム実況などに応用できるのではないかと思います。

今回はこのFirstVRを手に入れたので、チュートリアルをやって動かしてみました。


# 動かすまでの流れ

## 1.ファームウェアアップデートする

まずはFirstVRのファームウェアアップデートをやります。
やり方は[公式サイト](https://first-vr.com/tutorial-firmwareupdate/)で解説されています。
**なお、ファームウェアアップデートはiOSからやったほうが楽です**。

![iOS](https://i0.wp.com/first-vr.com/wp-content/uploads/2018/10/IMG_0084.png?resize=576%2C1024&ssl=1)
専用アプリをインストールして

![iOS](https://i1.wp.com/first-vr.com/wp-content/uploads/2018/10/IMG_0086.png?resize=576%2C1024&ssl=1)
firmwareの項目を選び、コントローラとペアリングしたあとにアップデートを押せば終わりです。


なお、Androidからのファームウェアアップデートはトライして挫折しました。
（Androidでのやり方の説明なのに、iOSを使って解説されており差異がある部分でわからなくなる。）


## 2. Unity SDKダウンロードする

[FIRST VR Developer Center](https://dev.first-vr.com/)という開発者向けサイトからSDKをダウンロードします。
ダウンロードにはアカウント登録が必要です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47146/79861de6-b6c8-0af5-dd50-a09f6470a04f.png)

## 3. Unityプロジェクトにインポートする

今回はせっかくなので、この記事執筆時点で最新版の「**Unity 2018.3.0b7**」でプロジェクトを作成しました。

SDKのインポートですが、**zipを解凍すると「Assets」と「ProjectSettings」がそのまま出てくる**ので、これをUnityProjectにD&Dします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47146/14453499-98d2-481b-0413-f78e27719005.png)

そうするとPlayerSettingsも当然上書きされるので、SDK導入後にお好みで調整してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47146/5986e92a-9d40-f2a3-d3cc-62f519d5ff08.png)
（.NET 4.Xにだけ切り替えた）

## 4. ビルドして実機転送する

FirstVRはEditor上でのデバッグに対応していません。
そのため、動作確認にはiOS/Android向けにビルドして実機で確認する必要があります。

とりあえず、何も考えずにサンプルシーンだけ含めてビルドしてみます。
今回はAndroid(Galaxy S8)で動作確認してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47146/6568bfe8-52a9-bf26-b947-70004b00a1a8.png)


そしてビルドが終わり、実機で動作確認しようとすると、**アプリが落ちました。**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47146/1f3ef40f-c427-b1e8-66ef-2747f95380a2.png)

## 5. そのままでは動かないので修正する

強制終了してアプリが立ち上がらないので、**Debugビルド**して、Android Device Monitorで何が起きているのか確認します。

![f1.png](https://qiita-image-store.s3.amazonaws.com/0/47146/a0bf3b56-7c36-3ce7-9ed5-140349df90b6.png)

`Didn't find class com.unity3d.player.UnityPlayerProxyActivity` 的なエラーが起きています。
そもそも、`com.unity3d.player.UnityPlayerProxyActivity`は、かなり昔(Unity 5系)あたりで非推奨となったActivityで、**Unity 2018.1の時点で削除されています。**
([Unity 2018.1.0b13 リリースノート](https://unity3d.com/jp/unity/beta/unity2018.1.0b13))

ということで、**FirstVR SDK付属のAndroidManifestファイルが古い**のが原因なのでこれを修正します。

#### AndroidManifestの修正

`Assets\Plugins\Android\AndroidManifest.xml` を書き換えます。

```xml:変更前(20-44行目)
    <application
    	android:theme="@style/UnityThemeSelector"
		android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:debuggable="true">
        <activity android:name="com.unity3d.player.UnityPlayerProxyActivity"
                  android:label="@string/app_name"
                  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:label="@string/app_name"
                  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        </activity>
        <activity android:name="com.unity3d.player.UnityPlayerNativeActivity"
                  android:label="@string/app_name"
                  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
            <meta-data android:name="android.app.lib_name" android:value="unity" />
            <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
             <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
        </activity>
    </application>
```

```xml:変更後
  <application
    	android:theme="@style/UnityThemeSelector"
		android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:debuggable="true">
        <activity android:name="com.unity3d.player.UnityPlayerActivity" 
                  android:label="@string/app_name"
                  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
```

これでビルドすると、無事に起動するようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47146/375e8143-f0c8-6093-7ce4-12eb34aa06d9.png)


**追記:FirstVRの方とコンタクトを取り、SDKの方を修正してもらえることになりました。**

## 6. 実機で動作確認

まず、コントローラを腕に装着します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47146/7bc434b6-9378-5f7b-7298-e04140344252.png)

その後、コントローラとAndroid端末を接続するのですが、注意点があります。**ペアリングは必要なく、コントローラを起動して端末に近づければ接続されます。**
[クイックスタートガイド](https://first-vr.com/quickstart/)の下の方に詳しく書いてあるので良く読みましょう。

```
Q3. FirstVRコントローラと使用しているスマートフォンが接続されません。
A3. 以下点をご確認いただきますようお願い申し上げます。ご確認の上、ご不明点がございまいしたらお問い合わせ窓口までご連絡をお願い致します。

[コントローラ接続の確認点]
1.お使いの端末がiPhone6S以降またはAndroid6.0以降である。
2.お使いの端末のBluetoothがver. 4.2である。
3.コントローラとスマートフォンはペアリングの必要はございません。スマートフォンのBluetoothをオンにする→コントローラの電源を点ける→アプリを立ち上げる→コントローラをスマートフォンに近づける→接続完了します。

[Androidをお使いの方へ]
AndroidでFirstVR Bluetooth接続できない場合の対処法
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「設定」→「位置情報」→メニュー（縦3つのドット）→「スキャン」からBluetoothのスキャンをオフにする
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
```

「位置情報のBluethoothをOFFにする」がポイントかも。


また、端末とコントローラの接続はBLEを用いているとのことです。
そのため、**端末のアンテナ部分とコントローラの距離を可能な限り近づけること**が接続を安定させるコツだそうです。
（電波強度を用いて端末間の距離を計測し、ペアリングするか判断している模様。）

### 動作の様子

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47146/1f8b1e52-5814-58be-dcdb-d52efddbd344.png)

サンプルアプリで取れるパラメータ

* 腕の角度
* 腕の加速度（絶対値）
* 腕の速度（絶対値）
* 腕全体の方角（起動時を正面として、腕が身体の正面、上、下、右、左、後ろのどこに回り込んだか）
* 腕の状態（腕の面がどこを向いているか）
* 腕の動き（スワイプ、シェイク）
* 各筋変位センサのパラメータ


# まとめ

* ファームウェアアップデートはiOSからやったほうが圧倒的に簡単
* アプリとコントローラの接続はコツが必要
* UnityEditor上で動作確認できず、実機ビルドが必要。


動作確認のたびに実機ビルドは流石に厳しいので、UnityEditor上でデバッグできるようになるのを期待。