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
(2018/10/12 追記)
下記の環境で再検証しました。
- Mac OSX 10.13.6
- Unity 2018.2.11f1
- iOS 12.0
- Xcode 10.0
- ARKit Plugin 2.0.0
1.大まかな考え方
まず、今回の仕組みを書くと、iOSデバイス側に、カメラ映像や傾き情報をUnity Editorに送るためのアプリをインストールし、そのアプリとUnity Editor間でネットワーク通信するというものです。アプリは、ARKitプラグインのunitypackageに入っているサンプルシーンの1つをそのままデプロイします。(Apple Storeから取得ではないことに注意ください)
ということで、手順はこうなります。
- 手順1:iOSデバイスにリモート操作用のアプリをデプロイ
- 手順2:Unity Editorでリモート操作用のPrefabをシーンに追加
- 手順3:Editor実行時にconnection操作を実行
以下、Asset Storeまたはbitbucketから、ARKitプラグインをインポート済みとして進めます。プラグインは下記にあります。
(Bitbucketからも同様のものが取得可能、と複数のサイトで見ましたが、bitbucketに置かれているものはバージョンがわからなかったため、私はAsset Storeのものを使いました)
2018/10/12 追記
Asset Storeではno longer availableになっていました。
一方、BitBucketでは更新が進んでいました。下記のtagページよりv2.0.0をダウンロードします。
Unity-Technologies / Unity-ARKit-Plugin / Downloads — Bitbucket
2.実行手順
2.1 iOSデバイスにリモート操作用のアプリをデプロイ
まずはUnityARKitRemoteシーンを開いて、これだけをデプロイします。このシーンはMain CameraとDirectional Lightしかありませんが、Main Cameraにはこのようにリモート実行用のスクリプトがアタッチされています。
デプロイ手順については省略します。必要あれば下記をご参考ください。
【2017/10/5更新】Unityで作ったアプリをiOSデバイスに転送する(無料) - CrossRoad
(2018/10/12追記)
Untiy2018でARKitPlugin v2.0.0を使う場合、Player Settingの設定が少し変わっていましたので追記します。id:smygw72さんのご指摘で気づきました。ありがとうございます。
変更点1:Requires ARKit supportの設定項目が増えた
Players SettingsのOther Settingsにあります。これにチェックを入れると、少し上の項目のCamera Usage Descriptionに"Required for augmented reality support."というテキストが自動入力されます。変更点2:XCodeプロジェクトを生成するとき、Debugモードに変更する
UnityのPlayer SettingsでReleaseモードのままにしていると、この後iOS実機にデプロイするアプリとUnity Editorとのconnectionに失敗し、Failed to connect to playerというエラーが出ました。変更点3:XCodeプロジェクトを生成するとき、Development Buildを有効にする
Development Buildは画面右下です。ここまで実行してからXCodeプロジェクト生成、iOS実機にデプロイすると、connectionを確立することができました。
2-2. Unity Editorでリモート操作用のPrefabをシーンに追加
リモート実行したい任意のシーンで、ARKitRemoteConnection PrefabをHierarchy Viewに追加するだけです。テスト用にEditorTestSceneシーンが準備されているので、まずはこのシーンを開いてからARKitRemoteConnection Prefabを追加します。
2-3. Editor実行時にconnection操作を実行
iOSデバイスとPCをライトニングケーブルで接続したままで、iOSデバイス側から1でデプロイしたアプリを実行します。次に、Unity側でEditorからSceneを実行し、「Console」のConnected playerというタブを選択します(①)。
ここで、iOSデバイスの機種名とデバイス名を選択します(②)。すると、Editor上でStart Remote ARkit Sessionというボタン(OnGUIの)が出るので、これをクリックします。
iOSデバイス側は黒い画面のままですが、iOSデバイスのカメラ出力とAR表示されたオブジェクトがUnity Editorに表示されます。
【スポンサーリンク】
3. Tips
3-1. IPアドレスの入力について
Console画面では、<Enter IP>をクリックするとIPアドレスを入力することができます。
今回は検討中にIPアドレスを入力しましたがうまくいきませんでした。Conneced playerの機能はUnity 2017から入ったもののようです。ARKit固有ではなく、別のデバイスを接続するときに使うのかもしれません。
3-2. connectionに失敗するとき
接続に失敗する場合、ログにFailed to connect to playerと表示されて失敗する場合と、下記の画像のように、Connecting to player.. (this can take a while) と表示される場合の2パターンがありました。
(補足)後者は一見うまくいきそうに見えるのですが、100%失敗しました。このような場合、
・iOSデバイスをPCをライトニングケーブルで接続
・iTunesがiOSデバイスに対して何か働きかけているとき(例:同期、iOSアップデート通知)は、iTunesを終了する
のいずれかを実行すると、connected playerにiOSデバイス名が表示されて、connectionすることができました。
その他補足です。
(1) 理由は不明ですが、機種名(例:iPhoneSE(26f2c5) )を選択してもうまくいかず、iPhonePlayer(デバイス名:56000)を選択するとうまくいきました。
(2) いったんconnectionが確立すれば、ライトニングケーブルは抜いても大丈夫でした。
(3) PCがスタンバイに入った、iOSアプリ側が終了下などの状態変化があったときは、再度ケーブルで接続する必要がありそうです。
3-3. 起動順番について
試したところ、下記のどちらでもconnectionを確立することができました。
- iPhone側のアプリ起動 -> Unity Editor起動してからConnected playerでデバイスを指定
- Unity Editorを起動 -> iphone側のアプリを起動してからConnected player でデバイスを指定
3-4. UnityRemoteとUnityARKitRemoteの違い
実機にアプリをデプロイせずに動作検証をする方法として、UnityRemoteがあります。
ただし、UnityRemoteははEditorの画面をそのまま転送するので、ARKitのようにiOSデバイス側のカメラが必要なものには使えません。ダメ元で使ってみましたが、Unity Editorの緑色の画面がそのままiOSデバイスに表示されるだけで、カメラの制御はできませんでした。
4.終わりに
今回、ARハッカソン参加の準備のために調べてみましたが、iOSデバイスのカメラ映像がUnity Editorに届くまで数秒近くの遅延があります。
また、iOSデバイスを少し動かすだけで、手順3で紹介したように歪んで表示されます。今後改善されるかは不明ですが、現時点では作ったものの雰囲気の確認程度に活用し、細かい動作確認は実機へのデプロイをした方がよいかもしれません。