前回の記事でUnity2017.2.0b2のTangoサポートについて調査しましたが、ビルドエラーが発生してしまい、実機確認ができていませんでした。
その後、発生していたビルドエラーの原因が特定できたのでリトライしたところ、Tangoのメッシュ構成(3DR)が使えるところまではできました。
体調良くなってきたので2017.2のTangoリベンジ!
— jyuko (@jyuko49) 2017年7月10日
Spacial Mapperが動くところまではできましたん。 pic.twitter.com/uz0B520rzn
ビルドエラーへの対処法
何度かビルドエラーが出たので、それぞれ行なった対処をまとめておきます。
JDKのバージョン確認
JDKバージョンが1.8以上でないとビルドが通らないようです。
前に変更したような気もするのですが、Unityをアップデートしたことで変わってしまったのかも?
発生するエラーメッセージ、対処法ともに以下の記事がドンピシャで、非常に助かりました。
Tango SDKとの共存エラー?
Unity5.6でTango SDK for Unityを使って開発したプロジェクトをコンバートした際に起きました。
エラーメッセージからすると、Tango SDKとUnityでTangoのライブラリが競合しているように見える。
ということで、
Tango SDK、Tango Prefabを削除 → ビルドエラー
Tempフォルダを消してリトライ → ビルドエラー
もうわからん!!
諦めて、テスト用のプロジェクトを新規に作成し、Tango SDKはインストールせずにUnityエディタのTangoサポートを有効にするとエラーは発生しませんでした。
解決はしたものの、Tango SDKで開発を進めたプロジェクトを移行したい場合には追加調査が必要です。
Target API Level
ZenFone AR (Android 7.0)で実機テストを行う際に発生しました。
正確には、ビルドエラーではなく、ビルドは通った上でアプリが起動しないという症状です。
この件については、Target API Levelを明示的に"Android 6.0 'Marshmallow' (API level 23)"にすると直りました。
原因となっている事象については、あまり理解できていませんが、Unity5.6.2+Tango SDK for Unity(Ikariotikos)の環境では"Automatic (highest installed)"にしていても問題なかったので、何か差異があるんでしょうか?
いずれにしても、Unityのアップデートで直ってくれないと困るので、一時的な対処と考えてください。
そういえば、Unityに統合されているTangoのコアライブラリはSDKバージョンどれなんですかね?
Tangoだけアップデートしたいときはどうするんだろう?
メッシュ構成を試す
ビルドが通るようになったので、前回の記事で試しそこねたSpatial Mapperの調査をしました。
Tango Spatial Mapperのセットアップ
まず、Sceneに"Create Empty"で空のGame Objectを追加します。名前も"Spatial Mapper"にしておきました。
次に、"Add Component"で"Tango Spatial Mapper"を追加します。
Inspectorを確認してみると、ほぼデフォルトの設定で使えそうですが、Renderingの"Render Material"がセットされていませんでした。
今回はテストなので"Default-Material"を使いました。
Tangoの3DRで生成されるメッシュは、Color、Normal、UVが利用でき、AR表示のオクルージョンにも使えるので、用途に応じてMaterialを設定してあげる必要があります。
ここまでの設定でビルドしたら動くかなと期待したのですが、Skyboxが表示されるのみで何もメッシュは表示されませんでした。
Tangoに接続するスクリプトの作成
動かない原因については、Tango Serviceに接続する処理がないためです。
Tango SDKの場合、"Tango Manager"がPrefab化されており、Sceneに置いてInspectorを設定するだけで、Tangoの各サービスに接続できるのですが、Unity2017.2b2にはそれらしきComponentが見当たりません。
要するに、スクリプトを書けってことですね。
"Create Empty"で空のGame Objectをもう一つ追加。名前は"Tango Service"にしました。
"Add Component" > "New Script"でC#スクリプト(ここでは"TangoService.cs")を作成して、以下のコードを書いてあげます。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Tango = UnityEngine.XR.Tango; public class TangoService : MonoBehaviour { // Use this for initialization void Start () { Tango.TangoConfig config = new Tango.TangoConfig (); config.enableDepth = true; config.enableColorCamera = true; Tango.TangoDevice.Connect (config); } // Update is called once per frame void Update () { } }
前回調べたとおり、Tangoの機能にアクセスするクラスのNameSpaceは、"UnityEngine.XR.Tango"になっています。
リファレンスがないので、Tango SDKで実装してきた経験と勘を頼りにコーディングしています。
まず、Tango.TangoDevice.Connect()
がそれっぽい。
このメソッドには、Tango.TangoConfig
を渡さなければいけないようなので、newします。
Tango.TangoConfig
のプロパティを見てみると、enableDepth
、enableColorCamera
があります。
これらを有効にして、接続してあげればメッシュ構成に必要なデータが取得できそうです。
といったところでビルドを試したところ、冒頭の通りメッシュが表示されるようになりました。
まとめ
2017.2.0b2のTangoサポートについて現段階でわかったのは、
- Tango SDK for Unityとの共存は難しそう
- ある程度スクリプトを書かないと使えなさそう
ということ。リファレンスがないと、ここから先の実装は難しそうです。
前の記事にも書いたとおり、Tango SDK for Unityの方がドキュメントもサンプルも充実していて使いやすく、そこからの移行が難しいとなると、当面はTango SDKのままでいいかなという感じです。
今後、リファレンスが出てきたり、機能が拡充されれば意見を変えるかもしれませんが、Tango SDKのバージョン追従もどうなるかわからないし、プラットフォームの併存は余計な混乱を招きそうで、既存の開発者からすると、あまりメリットが見えてこないですね・・・。