【Unity】ARKitでユニティちゃんを召喚してARKitRemoteで操作するまで

f:id:tm8r:20171012124516j:plain
やっていきましょう。

準備

ARKit自体はUnity5.6.2以上であれば動くと思いますが、ARKitRemoteを使用する場合、2017.1以降が必要になります。
僕は最近ARCore対応もしてるUnity2017.2b11を利用しているので、このバージョンで試してみます。

Unity ARKit Plugin
とにもかくにも、まずはARKitのプラグインをアセットストアからダウンロードします。

ついでにユニティちゃんトゥーンシェーダー2もダウンロードしておきます。
DATA DOWNLOAD-利用規約 | UNITY-CHAN! OFFICIAL WEBSITE

これで前準備は完了です。
記事タイトルで「ユニティちゃんを召喚してARKitRemoteで操作するまで」って言ってますけど、まずはARKitRemoteで操作をするところからやってみます。

iOS向けビルドの準備

File>BuildSettingsを開いて、iOSにSwitch Platformしたのち、Development Buildにチェックを入れます
次にScenes In BuildでUnityARKitSceneのチェックを外し、UnityARKitRemoteにチェックを入れます。

その後、このウィンドウ下部からPlayer Settingsを開き、Bundle Identifierを一意な何かに設定します。
今回は「com.tm8r.arkit」にしてみましたが、それぞれお好みのやつにしてください。

実行してみる

iPhoneへのデプロイが完了したらアプリを起動します。


するとこんな画面になると思います。(ならなかったらなんか失敗してます)

そしてPCに戻って、Assets>UnityARKitPlugin>ARKitRemote>EditorTestSceneを開き、再生を開始します。
f:id:tm8r:20171012113745p:plain

この状態でConsoleウィンドウを開いて、Connected Playerを選択すると、接続可能なデバイスが表示されています。
f:id:tm8r:20171012113813p:plain
尚、接続可能なのはUSB接続または同一ネットワークに接続されている端末だと思います。
ただ、Wifiでの接続はレスポンスが悪かったりそもそもリストに出てくるのに時間かかったりするので、個人的にはUSB接続を強く推奨します。

f:id:tm8r:20171012113819p:plain
自分のiPhoneを選択するとこんな感じで先程は表示されてなかった「Start Remote ARKit Session」というボタンが表示されるので、これを選択します。

f:id:tm8r:20171012113841p:plain
やったー!接続できたよー!

そのままだとアスペクト比がおかしいので、お使いのデバイスに合わせてGameViewの左上のプルダウンから変更してください。

今更ですが、ARKitRemoteを使用すると、接続したデバイスのカメラを用いてUnityエディタ上でARKitを利用したシーンを操作できるわけです。便利。
ただし、それなりに遅延するので最終的な確認は普通に実機のみでする感じになると思います。

ユニティちゃんを召喚する前に…

ARKitRemoteを利用することはできたので、早速ユニティちゃんを召喚していきたいわけですが、その前に今回利用したEditorTestSceneを見てみましょう。

f:id:tm8r:20171012130815p:plain
ざっと見ると概ね一番シンプルなUnityARKitSceneに似た構成ですが、見慣れない「ARKitRemoteConnection」というプレハブと、HitCubeParent>HitCubeのEditorHitTestというスクリプトが気になりますね。

というわけで、結論としては「ARKitRemoteConnection」がリモート操作には必須になります。

そしてUnityARKitSceneでも使用しているUnityARHitTestExampleだとInput.GetTouchを用いてタッチを検知しているため、エディタだと動きません。

そこで、Input.GetMouseButtonDownでタッチを検知するEditorHitTestを追加で使用している、という感じです。

ユニティちゃんを召喚しよう

だいたい仕組みが分かったので、シーンを構築していきます。
が、面倒なので今回はEditorTestSceneをUnityChanSceneとして複製して組み立てていきます。

まずはDirectional Lightの色がめっちゃ黄色くて気に食わないので白にしておきます。
次にCubeが不要なので削除、HitCubeParentも子供のHitCubeもろとも削除します。

そして空のGameObjectを追加して適当にリネームしたのち、ARCharacterManagerというスクリプトを作成してAddComponentします。
f:id:tm8r:20171012130913p:plain

書いたスクリプトはこんな感じ。

そしてInspectorでプレハブなどを設定します。
f:id:tm8r:20171012130022p:plain

この状態でUnityChanSceneを再生し、先程と同じ手順でiPhoneと接続します。
シーンやスクリプトに変更を加えても都度デプロイする必要がないのが嬉しいですね!

f:id:tm8r:20171012124729p:plain
いらっしゃいませ…!(めっちゃ見下されてる)

実際のシーンを実機にデプロイする

というわけでリモートでやってきましたが、じゃあ実際にそのシーンを実機で確認するのはどうしたらいいのかというと、BuildSettingsでUnityARKitRemoteのチェックを外して、確認したいシーンのチェックを入れるだけです。
普通。いつものやつ。
ARKitRemoteConnectionはシーンから削除などをしなくても動いてくれます。


動いてらっしゃる。

ちなみにこの画像だとオクルージョン効いてる感じですが、どうやってるかというと、シーンのGeneratePlanesにUnityARGeneratePlaneというスクリプトが設定されているんですが、このPlanePrefabをdebugPlanePrefabからoclusionPlanePrefabに変更するだけです。
すてきね。

ようは検知した水平面のmeshをCustom/MobileOcclusionシェーダーでレンダリングしてるだけです。
よって、水平面がズレればズレます。(実際上の画像だとズレてるけどマシなほう)

おわり

上に書いた通り、都度シーンをデプロイする必要がないというのが素晴らしいですね。
ただ、無視できないレベルの遅延が発生するので、そこはまあ目を瞑ってあくまでデバッグ目的で利用する感じかなと思います。

あとは、UnityARKitRemoteシーンは操作してないと普通にスリープするので、スリープしないようにするとか、たまにタッチしてあげるとかが必要です。

そして最大の欠点は、左手であらぬところにiPhoneを向けながら右手でPCを操作する様が大変滑稽だというところです。
つらい。完全な不審者。

周りの理解を得てから利用することをおすすめします!


f:id:tm8r:20170906162925p:plain
この作品はユニティちゃんライセンス条項の元に提供されています

スポンサーリンク