じゅころぐAR

ARのブログ

AROWオープンテストバージョンでUnityに3Dマップを表示するまで

本日、AROWのオープンテストバージョンが公開されました!
発表・事前登録されて以来、どんなSDKになるか期待していたので早速使ってみます。

AROWとは

位置情報・3Dマップを利用してARやゲームアプリの開発ができるUnity SDKです。
株式会社ドリコムの新規事業開発部門「DRIP(ドリップ)」部が手掛けているそうです。

arow.world

なお、ドリコムさんといえば・・・きららファンタジア

きららファンタジア

きららファンタジア

  • Aniplex Inc.
  • ゲーム
  • 無料

NEW GAME!ゆるキャン△スロウスタートなど、きらら作品のキャラクター達が作品を越えてコラボする夢の作品です。
jyukoはきららファンタジアを応援しています。
追伸:★5ひふみんの専用ぶきと★5ねねっちの実装を心よりお待ちしております。

さて、話を元に戻しましょう。

AROWは2019年4月現在、オープンテストバージョンとして公開されています。
テストバージョンとあって、商用・非商用・個人・法人を問わず、比較的自由に利用できるライセンスになっています。

アプリとしてリリースする場合、AROWの著作権表示が求められているので、きちんと守りましょう。
また、地図データにOpenStreetMapが使われており、OSMのクレジット表示も必要になります。

サンプルを動かす

無料のデベロッパー登録を行うと、SDKダウンロードのページからzipファイルがダウンロードできるようになり、解凍するとUnitypackageが格納されています。

f:id:jyuko49:20190424000836p:plain

SDKをダウンロードしたら、AROWスターティングガイドに沿ってサンプルを実行していきます。
https://arow.zendesk.com/hc/ja/categories/360001495392-AROW%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%AC%E3%82%A4%E3%83%89

まず、Unityで新規プロジェクトを作成して、ArowSDK.unitypackageをインポートします。

f:id:jyuko49:20190423201019p:plain

次にAssets/ArowSample/_StartSceneAssets/ArowSample/Scenes/以下のScene達をScenes In Buildに追加していきます。
一瞬、どうやるんだ?と思いましたが、ドラッグ&ドロップで追加できたんですね(知らなかった)

f:id:jyuko49:20190423204020p:plain

スターティングガイドではScripting Runtime Version.NET 4.6にするという手順がありましたが、Unity2019.1.0f2ではデフォルトが.NET 4.xになっており、変更なしでビルドは通りました。

f:id:jyuko49:20190423203054p:plain

プラットフォームをiOSにして、実機で動かしてみました。

Android実機でも試して、問題なく動作することを確認。

サンプルの構成を理解する

Scene_WalkInCreatedMapを参考にして、サンプルが行っている処理を理解していきます。

SceneのHierarchyを見ると以下のようになっており、GameMainにアタッチされたスクリプトArowSampleGameMain_RouteSearch.csが3Dマップを生成する処理を行っていることがわかります。

f:id:jyuko49:20190424075029p:plain

f:id:jyuko49:20190424075345p:plain

ArowSampleGameMain_RouteSearch.csが何をしているかというと、Initialize()ArowDemoMain.csをAddComponentしています。

private ArowDemoMain arowDemoMain;

void Start()
{
    Initialize();
}

private void Initialize()
{
    ...
    arowDemoMain = gameObject.AddComponent<ArowDemoMain>();
}

Update()の処理はstateに応じて処理が分かれているのですが、じっと眺めていると、arowDemoMain.Initialize()arowDemoMain.CreateRoads()arowDemoMain.CreateBuildingsNonCollider()を順に実行していることが読み取れます。

ここまでの処理をトレースするため、新規のシーンで一から作成してみます。

GameObjectを作成し、

f:id:jyuko49:20190424080751p:plain

動作テスト用のスクリプトArowTest.csをアタッチし、

f:id:jyuko49:20190424081028p:plain

ArowTest.csに以下のコードを書きます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ArowTest : MonoBehaviour
{
    void Start()
    {
        var arowDemoMain = gameObject.AddComponent<ArowSampleGame.SampleScripts.ArowDemoMain>();
        arowDemoMain.Initialize();
        arowDemoMain.CreateRoads();
        arowDemoMain.CreateBuildingsNonCollider();
    }
}

Unity Editorで実行してみると・・・、

f:id:jyuko49:20190424081350p:plain

3Dマップが表示されました。

実行時のSceneでは、road_parentbuilding_parentというGameObjectが動的に作成されており、この中に道路と建物のメッシュが格納されているようです。

f:id:jyuko49:20190424081457p:plain

もうちょっと見てみる

ArowDemoMain.csではどういう処理をしているんでしょうか。

マップデータは.arowmapファイルから読み込んで、arowMapObjectModelを生成しています。データはサーバから配信も可能だと思います。

private readonly string AROW_FILE_NAME = "shibuya.arowmap";

public void Initialize()
{
    // AROWマップデータの読み込み
    var filePath = Path.Combine(Application.streamingAssetsPath, AROW_FILE_NAME);
    mapDataBytes = File.ReadAllBytes(filePath);
    arowMapObjectModel = ArowMapObjectModel.LoadByData(mapDataBytes);
} 

サンプルのファイルサイズは数MBのオーダーです。

f:id:jyuko49:20190424083601p:plain

ビルの生成では、先程のarowMapObjectModelを用いてメッシュを生成しているようです。

// 「BuildingのMesh生成」に必要な設定を行う
var buildingMeshCreator = new BuildingCreator
.Builder(arowMapObjectModel.BuildingDataModels)
.SetWorldCenter(worldCenter)
.SetWorldScale(MapUtility.WorldScale)
.SetConfig(config)
.IsExtractWithTaskAsync(true)
.SetOnMeshBuildType(BuildingCreator.BUILD_TYPE.BUILDING)
.SetOnMeshCreatedCallBack((BuildingDataModelWithMesh buildingDataWithMesh) =>
{
    // Mesh生成が完了するたびに、そのmeshをGameObject化する
    CreateBuildingMeshScripts.CreateBuildingGameObject(buildingDataWithMesh, p.transform, worldCenter, MapUtility.WorldScale, config);
})
.SetOnCompletedCreateMeshCallBack((List<BuildingDataModelWithMesh> list) =>
{
    // 全てのmeshを生成し終えたら、state切り替え
    isEndOfFunction[MAP_CREATE.BUILDING] = true;
});
// 「BuildingのMesh生成」の開始
buildingMeshCreator.Build();

ここで使われているAPIは、スターティングガイドのサンプルAPIの紹介でも軽く触れられており、あとはリファレンスを読んでくださいとのこと。

とりあえず、3Dマップが表示されるところまではできたので、リファレンスを読みつつ、AR表示などやってみたいと思います。

続き
AROWオープンテストバージョンでARアプリを作る - じゅころぐAR