Cross Road

Unity、VR、MR、ARを中心とした技術ブログ

UnityARKitRemoteでデプロイせずに動作確認をする方法と、Tipsあれこれ

f:id:Takyu:20171210195016j:plain

Appleから発表されたARKitは、Xcode用のサンプルだけでなく、Unityのプラグインも公開されており、Unityでアプリ開発が可能です。

しかし、UnityでiOSアプリを作る場合、UnityでXcodeプロジェクトをビルド、XCodeからiOSデバイスにデプロイ、という2段階の手順が必要で少し手間がかかります。しかし、ARKitではUnity Editorで手軽に実行できる環境が準備されていました。

手順については、ARKit用のunity pluginの中にReadmeがあります。また、日本語で手順を解説されている方もいらっしゃいます。

ただ、私の環境では公式の説明だけでは動きませんでした。そこで、つまづいたところを補完して手順を整理しました。


【実行環境】
Mac OSX 10.12.6
Unity 2017.2.0f3
iOS 11.1.2
Xcode 9.2

目次

1. 大ざっぱな考え方

手順1:iOSデバイスにリモート操作用のアプリをデプロイ

手順2. Unity Editorでリモート操作用のPrefabをシーンに追加

手順3. Editor実行時にconnection操作を実行

2. Tips

3. おわりに

手順

1. 大ざっぱな考え方

まず、大ざっぱに今回の仕組みを書くと、iOSデバイス側に、カメラ映像や傾き情報をUnity Editorに送るためのアプリをインストールし、そのアプリとUnity Editor間でネットワーク通信するというものです。

アプリは、ARKitプラグインのunitypackageに入っているサンプルシーンの1つをそのままデプロイします。
(Apple Storeから取得ではないことに注意ください)


ということで、手順はこうなります。

(1) iOSデバイスにリモート操作用のアプリをデプロイ

(2) Unity Editorでリモート操作用のPrefabをシーンに追加

(3) Editor実行時にconnection操作を実行



以下、Asset Storeまたはbitbucketから、ARKitプラグインをインポート済みとして進めます。プラグインは下記にあります。

Unity ARKit Plugin

Unity-Technologies / Unity-ARKit-Plugin / source / — Bitbucket

(Bitbucketからも同様のものが取得可能、と複数のサイトで見ましたが、bitbucketに置かれているものはバージョンがわからなかったため、私はAsset Storeのものを使いました)

手順1:iOSデバイスにリモート操作用のアプリをデプロイ

リモート操作用シーンをデプロイする

まずはUnityARKitRemoteシーンを開いて、これだけをデプロイします。このシーンはMain CameraとDirectional Lightしかありませんが、Main Cameraにはこのようにリモート実行用のスクリプトがアタッチされています。

Main Cameraにアタッチされたスクリプト

デプロイ手順については省略します。必要あれば下記をご参考ください。

magicbullet.hatenablog.jp


手順2. Unity Editorでリモート操作用のPrefabをシーンに追加

リモート実行したい任意のシーンで、ARKitRemoteConnection PrefabをHierarchy Viewに追加するだけです。

テスト用にEditorTestSceneシーンが準備されているので、まずはこれで確認できます。

手順3. Editor実行時にconnection操作を実行

iOSデバイスとPCをライトニングケーブルで接続したままで、iOSデバイス側から1でデプロイしたアプリを実行します。

次に、Unity側でEditorからSceneを実行し、「Console」のConnected playerというタブを選択します(①)。

[f:id:Takyu:20171210194558p:plain:ConsoleのConnected Player]

ここで、iOSデバイスの機種名とデバイス名を選択します(②)。

すると、Editor上でStart Remote ARkit Sessionというボタン(OnGUIの)が出るので、これをクリックします。

iOSデバイス側は黒い画面のままですが、iOSデバイスのカメラ出力とAR表示されたオブジェクトがUnity Editorに表示されます。

[f:id:Takyu:20171210195016j:plain:Unity Editorに表示されたiOSデバイスの画面]


2. Tips

2-1. IPアドレスの入力について

Console画面では、<Enter IP>をクリックするとIPアドレスを入力することができます。

ConsoleからIPアドレスの入力を実施可能


今回は検討中にIPアドレスを入力しましたがうまくいきませんでした。

Conneced playerの機能はUnity 2017から入ったもののようです。ARKit固有ではなく、別のデバイスを接続するときに使うのかもしれません。

2-2. connectionに失敗するとき

接続に失敗する場合、ログにFailed to connect to playerと表示されて失敗する場合と、下記の画像のように、Connecting to player.. (this can take a while) と表示される場合の2パターンがありました。

connection失敗時のログ

(補足)後者は一見うまくいきそうに見えるのですが、100%失敗しました。

このような場合、

・iOSデバイスをPCをライトニングケーブルで接続

・iTunesがiOSデバイスに対して何か働きかけているとき(例:同期、iOSアップデート通知)は、iTunesを終了する

のいずれかを実行すると、connected playerにiOSデバイス名が表示されて、connectionすることができました。


その他補足です。

(1) 理由は不明ですが、機種名(例:iPhoneSE(26f2c5) )を選択してもうまくいかず、iPhonePlayer(デバイス名:56000)を選択するとうまくいきました。

(2) いったんconnectionが確立すれば、ライトニングケーブルは抜いても大丈夫でした。

(3) PCがスタンバイに入った、iOSアプリ側が終了下などの状態変化があったときは、再度ケーブルで接続する必要がありそうです。

2-3. 起動順番について

試したところ、下記のどちらでもconnectionを確立することができました。

iPhone側のアプリ起動 -> Unity Editor起動してからConnected playerでデバイスを指定

Unity Editorを起動 -> iphone側のアプリを起動してからConnected player でデバイスを指定

2-4. UnityRemoteとUnityARKitRemoteの違い

実機にアプリをデプロイせずに動作検証をする方法として、UnityRemoteがあります。

docs.unity3d.com


ただし、UnityRemoteははEditorの画面をそのまま転送するので、ARKitのようにiOSデバイス側のカメラが必要なものには使えません。

ダメ元で使ってみましたが、Unity Editorの緑色の画面がそのままiOSデバイスに表示されるだけで、カメラの制御はできませんでした。

3.終わりに

今回、ARハッカソン参加の準備のために調べてみましたが、iOSデバイスのカメラ映像がUnity Editorに届くまで数秒近くの遅延があります。

また、iOSデバイスを少し動かすだけで、手順3で紹介したように歪んで表示されます。

今後改善されるかは不明ですが、現時点では作ったものの雰囲気の確認程度に活用し、細かい動作確認は実機へのデプロイをした方がよいかもしれません。