VR道を往く!

VRとかUnityとかそういう話中心に。

Google VR (Daydream) コントローラをAndroid Nでない実機(Android、iOS)から利用する。Unity Remote不要な方法

f:id:kaninabe:20160607002223p:plain

前回はGoogle VRアプリのサンプルを動作させるまでを書きました。

vr-cto.hateblo.jp

ただコントローラとの連携などCardboard時代にはなかった機能を使うには、 Android N DP3以降がインストールされた対応端末(今の所Nexus 6P)が必要だということでした。 ただし、Unity Editor上では適当なAndroid端末に コントローラのエミュレータアプリを入れて動作を検証することは可能ということでした。

そういう訳で、実機上でコントローラなどを試すにはとにかくNexus 6Pを買ってAndroid Nをインストールする必要があるのですが、 面倒くさいしNexus買う金もないけど、何とか手持ちの実機でも使わせてよと我儘なことを考えていました。

ちなみにmogura VRさんがUnity Remoteを使った方法も紹介されています。 まあデバッグ目的にはこれでいいかもしれませんね。

www.moguravr.com

ただエミュレータアプリに接続するルーチンはネイティブで書いてある訳では無さそうだったので、 もしかしたらUnity Remoteを使わなくても実機で動かせるんじゃない?
ついでに言うとiOSでも動かせるんじゃない?
と軽い気持ちでソースを眺めることにしました。

結論:できた。

少しソースを修正するだけで簡単にできたので以下に手順を書いていきます。多分Unity Remote使うよりもサクサク動くんじゃないかなあ。

必要な物

  • Google VRアプリを書き出せるUnity開発環境
  • コントローラ用Android端末
  • Google VRアプリを動かす端末(Android or iOS端末)

UnityのAndroidiOS開発環境は整っているものとします。 また、コントローラ用Androidには前回の記事を参考に コントローラのエミュレータアプリをインストールしておいてください。 ちなみに今回コントローラに使用した端末はGalaxy S6 (Android 6.0.1)、 Google VR側は同じくGalaxy S6、 またiOS検証用としてiPad mini2 (iOS 8.3)を使いました。

1. AndroidWifiをONにしてネットワークにつなぐ

USBでなくWifiで接続するので2台のAndroidWifiをオンにします。 ちなみにGoogle様の解説によるとGoogle VR側の端末からコントローラ側の端末につなぐ方法は

(a) コントローラの側の端末を親機にしてテザリングする
(b) 2台をLANにつなぎつつ、Google VRを動かす端末上のGoogle VR Servicesの設定でコントローラ端末のアドレスを指定

という2つの方法が提案されています。 (b)はGoogle VR ServicesがそもそもAndroid Nで追加された機能かと思うので(a)を使うのが楽かと思います。 ただ自分の場合はSIMが刺さっておらず、SIMがないとテザリングできないと言われました。

f:id:kaninabe:20160606175141p:plain:w300
Oh...

まあそういうことなので諦めてLAN環境につなぐことにして話を進めていきます。 とりあえずコントローラ側でコントローラのエミュレータアプリを開いて IPアドレスを確認しておきます。

f:id:kaninabe:20160606175005p:plain:w400

2. Unityプロジェクトとスクリプトの修正

前回も使用したコントローラ確認用のサンプルアプリを利用します。 ヒエラルキー内のオブジェクト"GvrControllerMain"のGvrControllerコンポーネントに emulatorConnectionModeというパラメータがあります。 デフォルトではUSBになっていますが、今回はWifiを使うので設定を変更します。

f:id:kaninabe:20160606174940p:plain

次にスクリプトを少し修正します。修正箇所は次の2か所です。

  • Assets/GoogleVR/Scripts/Controller/Internal/Emulator/EmulatorConfig.cs
    // IP address of the phone, when connected to the PC via WiFi.
    public static readonly string WIFI_SERVER_IP = "192.168.0.78";//"192.168.43.1";

このファイルの最後にWIFI_SERVER_IPという変数があるので、 これを先ほどのコントローラ端末のIPへと書き換えておきます。 もし手順1で(a)のコントローラを親機とするテザリングを選択した場合は、親機のIPアドレスが192.168.43.1になるらしい?ので、 ここの変更はしなくてよいかも(未確認)。

  • Assets/GoogleVR/Scripts/Controller/Internal/ControllerProviderFactory.cs
#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_ANDROID || UNITY_IOS // <-- ここにUNITY_ANDROIDとUNITY_IOSを追加
      // Use the Controller Emulator.
      return new EmulatorControllerProvider(owner.emulatorConnectionMode, owner.enableGyro,
          owner.enableAccel);
//#elif UNITY_ANDROID // ここ以下3行をコメントアウト
//      // Use the GVR C API.
//      return new AndroidNativeControllerProvider(owner.enableGyro, owner.enableAccel);
#else

26行目辺りからの#ifディレクティブを修正。AndroidiOSの時もEditor、スタンドアロンの時と同じようにエミュレータを使うよう書き換えます。#elsif UNITY_ANDROIDの所の処理はコメントアウトしておきます。

3. 書き出し・実行

Galaxy S6に書き出し。ちゃんと動いた。


Google VR (Daydream) controller demo on Galaxy S6

続いてiPad miniでも書き出し。 本当はiPhoneでやるべきところをiPadでやっているのでサイズが変になっていますがお気になさらず。 しかしこちらでもちゃんとコントローラの動きがとれています。

f:id:kaninabe:20160606220414p:plain

これでコントローラを使ったデモも機種にこだわらず実機でできるようになりました! IPアドレスが変わったら書き出し直さないといけない欠点はありますが。 また、非常にアドホックな方法なうえ、公式の推奨しない利用方法でもあるため、今後のバージョンアップで使えなくなる可能性もあることにはご注意を。

どうでもいいおまけ - Gear VRでもGoogle VRアプリを一応見られる。

f:id:kaninabe:20160606233522p:plain

Cardboardを使わずにGear VRでGoogle VRアプリを見る方法。

Google VRアプリが起動した状態でGalaxyをGear VRに甘差しして、ピントをうまく調整すれば一応両眼視ができます。 旧バージョンのGear VR(Innovator Edition)だとぴったりとはまってOculus Homeが起動してしまうので、ちょっとたてつけの悪い製品版の方がおすすめです。 端子をきっちり差し込まないように意識してパチンとはめるのがコツです。

まあCardboardくらい買えっつー話ですね…。