Google VR (Daydream) コントローラをAndroid Nでない実機(Android、iOS)から利用する。Unity Remote不要な方法
前回はGoogle VRアプリのサンプルを動作させるまでを書きました。
ただコントローラとの連携などCardboard時代にはなかった機能を使うには、 Android N DP3以降がインストールされた対応端末(今の所Nexus 6P)が必要だということでした。 ただし、Unity Editor上では適当なAndroid端末に コントローラのエミュレータアプリを入れて動作を検証することは可能ということでした。
そういう訳で、実機上でコントローラなどを試すにはとにかくNexus 6Pを買ってAndroid Nをインストールする必要があるのですが、 面倒くさいしNexus買う金もないけど、何とか手持ちの実機でも使わせてよと我儘なことを考えていました。
ちなみにmogura VRさんがUnity Remoteを使った方法も紹介されています。 まあデバッグ目的にはこれでいいかもしれませんね。
ただエミュレータアプリに接続するルーチンはネイティブで書いてある訳では無さそうだったので、
もしかしたらUnity Remoteを使わなくても実機で動かせるんじゃない?
ついでに言うとiOSでも動かせるんじゃない?
と軽い気持ちでソースを眺めることにしました。
結論:できた。
少しソースを修正するだけで簡単にできたので以下に手順を書いていきます。多分Unity Remote使うよりもサクサク動くんじゃないかなあ。
必要な物
UnityのAndroid、iOS開発環境は整っているものとします。 また、コントローラ用Androidには前回の記事を参考に コントローラのエミュレータアプリをインストールしておいてください。 ちなみに今回コントローラに使用した端末はGalaxy S6 (Android 6.0.1)、 Google VR側は同じくGalaxy S6、 またiOS検証用としてiPad mini2 (iOS 8.3)を使いました。
1. AndroidのWifiをONにしてネットワークにつなぐ
USBでなくWifiで接続するので2台のAndroidのWifiをオンにします。 ちなみにGoogle様の解説によるとGoogle VR側の端末からコントローラ側の端末につなぐ方法は
(a) コントローラの側の端末を親機にしてテザリングする
(b) 2台をLANにつなぎつつ、Google VRを動かす端末上のGoogle VR Servicesの設定でコントローラ端末のアドレスを指定
という2つの方法が提案されています。 (b)はGoogle VR ServicesがそもそもAndroid Nで追加された機能かと思うので(a)を使うのが楽かと思います。 ただ自分の場合はSIMが刺さっておらず、SIMがないとテザリングできないと言われました。
Oh...
まあそういうことなので諦めてLAN環境につなぐことにして話を進めていきます。 とりあえずコントローラ側でコントローラのエミュレータアプリを開いて IPアドレスを確認しておきます。
2. Unityプロジェクトとスクリプトの修正
前回も使用したコントローラ確認用のサンプルアプリを利用します。 ヒエラルキー内のオブジェクト"GvrControllerMain"のGvrControllerコンポーネントに emulatorConnectionModeというパラメータがあります。 デフォルトではUSBになっていますが、今回はWifiを使うので設定を変更します。
次にスクリプトを少し修正します。修正箇所は次の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ディレクティブを修正。AndroidとiOSの時もEditor、スタンドアロンの時と同じようにエミュレータを使うよう書き換えます。#elsif UNITY_ANDROIDの所の処理はコメントアウトしておきます。
3. 書き出し・実行
Galaxy S6に書き出し。ちゃんと動いた。
Google VR (Daydream) controller demo on Galaxy S6
続いてiPad miniでも書き出し。 本当はiPhoneでやるべきところをiPadでやっているのでサイズが変になっていますがお気になさらず。 しかしこちらでもちゃんとコントローラの動きがとれています。
これでコントローラを使ったデモも機種にこだわらず実機でできるようになりました! IPアドレスが変わったら書き出し直さないといけない欠点はありますが。 また、非常にアドホックな方法なうえ、公式の推奨しない利用方法でもあるため、今後のバージョンアップで使えなくなる可能性もあることにはご注意を。
どうでもいいおまけ - Gear VRでもGoogle VRアプリを一応見られる。
Cardboardを使わずにGear VRでGoogle VRアプリを見る方法。
Google VRアプリが起動した状態でGalaxyをGear VRに甘差しして、ピントをうまく調整すれば一応両眼視ができます。 旧バージョンのGear VR(Innovator Edition)だとぴったりとはまってOculus Homeが起動してしまうので、ちょっとたてつけの悪い製品版の方がおすすめです。 端子をきっちり差し込まないように意識してパチンとはめるのがコツです。
まあCardboardくらい買えっつー話ですね…。
Linkcool CardboardV2 コントロールボタンとベルト付き 2色 (ブラック)
- 出版社/メーカー: Linkcool
- メディア: エレクトロニクス
- この商品を含むブログを見る