じゅころぐAR

ARのブログ

Unity2017.2.0b2のTangoサポートについて(実機でSpatial Mapperが動くところまで)

前回の記事でUnity2017.2.0b2のTangoサポートについて調査しましたが、ビルドエラーが発生してしまい、実機確認ができていませんでした。

jyuko49.hatenablog.com

その後、発生していたビルドエラーの原因が特定できたのでリトライしたところ、Tangoのメッシュ構成(3DR)が使えるところまではできました。

ビルドエラーへの対処法

何度かビルドエラーが出たので、それぞれ行なった対処をまとめておきます。

JDKのバージョン確認

JDKバージョンが1.8以上でないとビルドが通らないようです。
前に変更したような気もするのですが、Unityをアップデートしたことで変わってしまったのかも?

発生するエラーメッセージ、対処法ともに以下の記事がドンピシャで、非常に助かりました。

blog.naichilab.com

Tango SDKとの共存エラー?

Unity5.6でTango SDK for Unityを使って開発したプロジェクトをコンバートした際に起きました。

f:id:jyuko49:20170710211023p:plain

エラーメッセージからすると、Tango SDKとUnityでTangoのライブラリが競合しているように見える。
ということで、

Tango SDK、Tango Prefabを削除 → ビルドエラー
Tempフォルダを消してリトライ → ビルドエラー
もうわからん!!

諦めて、テスト用のプロジェクトを新規に作成し、Tango SDKはインストールせずにUnityエディタのTangoサポートを有効にするとエラーは発生しませんでした。
解決はしたものの、Tango SDKで開発を進めたプロジェクトを移行したい場合には追加調査が必要です。

Target API Level

ZenFone AR (Android 7.0)で実機テストを行う際に発生しました。
正確には、ビルドエラーではなく、ビルドは通った上でアプリが起動しないという症状です。

f:id:jyuko49:20170710212704j:plain

この件については、Target API Levelを明示的に"Android 6.0 'Marshmallow' (API level 23)"にすると直りました。

f:id:jyuko49:20170710211813p:plain

原因となっている事象については、あまり理解できていませんが、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"を追加します。

f:id:jyuko49:20170710214515p:plain

Inspectorを確認してみると、ほぼデフォルトの設定で使えそうですが、Renderingの"Render Material"がセットされていませんでした。
今回はテストなので"Default-Material"を使いました。

f:id:jyuko49:20170710214737p:plain

Tangoの3DRで生成されるメッシュは、Color、Normal、UVが利用でき、AR表示のオクルージョンにも使えるので、用途に応じてMaterialを設定してあげる必要があります。

ここまでの設定でビルドしたら動くかなと期待したのですが、Skyboxが表示されるのみで何もメッシュは表示されませんでした。

Tangoに接続するスクリプトの作成

動かない原因については、Tango Serviceに接続する処理がないためです。

qiita.com

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のプロパティを見てみると、enableDepthenableColorCameraがあります。

f:id:jyuko49:20170710222649p:plain

これらを有効にして、接続してあげればメッシュ構成に必要なデータが取得できそうです。
といったところでビルドを試したところ、冒頭の通りメッシュが表示されるようになりました。

まとめ

2017.2.0b2のTangoサポートについて現段階でわかったのは、

  • Tango SDK for Unityとの共存は難しそう
  • ある程度スクリプトを書かないと使えなさそう

ということ。リファレンスがないと、ここから先の実装は難しそうです。

前の記事にも書いたとおり、Tango SDK for Unityの方がドキュメントもサンプルも充実していて使いやすく、そこからの移行が難しいとなると、当面はTango SDKのままでいいかなという感じです。
今後、リファレンスが出てきたり、機能が拡充されれば意見を変えるかもしれませんが、Tango SDKのバージョン追従もどうなるかわからないし、プラットフォームの併存は余計な混乱を招きそうで、既存の開発者からすると、あまりメリットが見えてこないですね・・・。