ARCore Geospatial APIのBalloon PopサンプルをAndroidビルドして試す

# 概要
2022年5月12日(JTS)に開催されたGoogle IOでARCoreの新しいAPIが発表されました。
その名も「Geospatial API」！

スマホの緯度、経度、高度、向きをGPSより正確に測位できる機能です。
ストリートビューがある場所なら利用可能とのことです。日本だと大半の公道が当てはまります。
<iframe width="560" height="315" src="https://www.youtube.com/embed/udoSz_UBUdc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

どのようなアプリが作れるかは[公式ページ](https://developers.googleblog.com/2022/05/Make-the-world-your-canvas-ARCore-Geospatial-API.html)から確認できます。

この記事ではGeospatial APIのサンプルアプリをAndroidビルドして動作確認をします。
公道で「Geospatial APIすげー」するまでがゴールです。
Unityに慣れている方なら30分くらいでできると思います。

# 料金的な話
ARCore APIの料金を調べたところ、どうやら現在は無料のようです。(要出典)

# [Balloon Pop](https://github.com/googlecreativelab/balloon-pop)とは
Geospatial APIの公開に伴い、サンプルアプリのUnityプロジェクトがいくつか公開されました。
Balloon Popはそのうちの一つです。

このアプリは以下のことが出来ます。
- 風船を配置する
- 配置した風船を全て削除する
- 風船をパチンコで割る
- 現在の測位情報を表示する

風船の位置はFirestoreを介して同じアプリのユーザー間で共有されます。
そのため、他人の配置した風船を割るといったことも可能です。
割った風船はすぐに再生します。

# 動作確認結果
以下が外で動作確認をした結果です。
ディズニーランドではストリートビューが非対応らしく精度が悪いです。
家の前の道路では素晴らしい精度でした。
![Videotogif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/85a08968-f127-50c1-14c0-b78a9983f0e8.gif)

# 手順
基本的にリポジトリのREADME.md通りに進めますが、書いていなくてハマったことがあるのでこの記事を書きました。

## 1. 対応するバージョンのUnityをインストールする
Balloon PopはUnity 2019.4.36f1で開発されています。上位バージョンなら互換はあるでしょうが、無駄にエラーでハマって消耗しないように同じバージョンのUnityをインストールした方が良いでしょう。

Androidビルド用のモジュールは全て追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/98e7d3db-1dd0-cd53-e150-315d4e44383f.png)

自分の環境では10分くらいかかるので初めにやっておきます。

## 2. リポジトリをcloneしてUnityで開く
1. [GitHubリポジトリ](https://github.com/googlecreativelab/balloon-pop)からUnityプロジェクトをcloneしてきます。
2. cloneが完了したら手順1でインストールしたUnity 2019.4.36f1でcloneしたリポジトリを開きます。
3. ビルド先のプラットフォームをAndroidに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/e3914f5f-0aa1-988f-b3b4-062f5c73fb42.png)


コンソールを見るとエラーが50個出ています。
これらは以降の手順で解消されるので安心してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/58ed2528-483a-f5f5-43ec-eb4f97920d94.png)

## 3. ARCore APIのAPIキーを取得する
Geospatial APIを利用するためにはARCore APIにアプリからアクセスする必要があります。認証方法はキーレスなどもありますが、公式の手順がAPIキーを使ったものなのでそれに倣います。

1. [GCP](https://console.cloud.google.com/projectcreate?previousPage=%2Fhome%2Fdashboard%3Fproject%3Dgeospatioal-api%26hl%3Dja&organizationId=0&hl=ja)にアクセスし、新しいプロジェクトを作成します。
既存のプロジェクトを持っている方はスキップでも構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/48b494b0-30d0-7c3c-8fc3-739797a13938.png)

2. 上部の検索バーに「ARCore」と入力し、ARCore APIのページに遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/242ed8b5-6623-0ef0-2641-c05a75a4278e.png)

3. ARCore APIを有効にします。

4. ARCore APIの管理ページに遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/a31beb9e-c770-5918-2caf-71da9026cefb.png)

5. APIキーを作成します。APIキーは次の手順で使うのでクリップボードにでもコピーしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/0e81ea6a-230b-6824-a5c5-81e49dd2e3ee.png)

## 4. APIキーをUnityプロジェクトに登録する
1. Unityで「プロジェクト設定」を開きます
2. XR Plug-in Management→ARCore Extentionsを開き、先程コピーしたAPIキーをペーストします。

## 5. ARCore Extentionsをインポートする
この手順はREADMEには書いてありませんでした。ARCore開発者のお約束なのでしょうか？
詳細な手順は[公式ドキュメント](https://developers.google.com/ar/develop/unity-arf/getting-started-extensions)にあります。

1. パッケージマネージャーを開く。
2. 以下のgit URLからARCore Extentionsパッケージを追加する。
```https://github.com/google-ar/arcore-unity-extensions.git```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/e569ba58-1975-67cb-0b3a-4def35b95583.png)

バージョン1.31.0以降が追加されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/07a7f21a-997c-f179-fcff-c41a312d5a4f.png)

これにより、コンソールエラーが4つ減りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/f345b006-6d5b-2ad4-acfc-d55e91ecd830.png)

## 6. Geospatial APIを有効にする
1. Unityで「プロジェクト設定」を開きます。
2. XR Plug-in Management→ARCore Extentions内に新しく出現している「Geospatial」にチェックを入れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/9464cf09-f5aa-913d-f795-d930770d62a4.png)



## 7. Firebase SDKをインポートする。
Firestoreに風船の位置を保存する為、このプロジェクトはFirebase SDKを使用します。

1. [公式サイト](https://firebase.google.com/docs/unity/setup)からFirebase SDKをDLする。
DLしたzipを解凍すると中に色々と入っています。今回は```dotnet4```ディレクトリ以下のファイルを使用します。
dotnet3か4かはUnityバージョンによって変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/3d4d7f31-4bba-77b6-a814-0c70aef11143.png)

2. 「FirebaseAuth.unitypackage」と「FirebaseFirestore.unitypackage」をインポートする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/9e97b38a-c802-bbe3-01ca-278d4d8c95f0.png)

このとき、ExternalDependencyManagerのチェックは外しておきます。
先程追加したARCore Extentionsにも同じものが含まれており、インポートしてしまうと重複エラーが出てどちらかを削除することになるためです。

これでエラーが全て消えました。後少しです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/caea6123-43f4-542d-b219-02e44698af1b.png)

## 8. Firebaseプロジェクトを準備する
1. [Firebaseコンソール](https://console.firebase.google.com/)から新規プロジェクトを作成します。GCPプロジェクトに追加しなければデフォルトで無料プランになるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/986137bf-624b-0d95-e2f5-5210cacd20e9.png)

2. Firestoreデータベースを作成します。
セキュリティ保護ルールは「本番」、ロケーションは日本からだと東京が速いので「asia-northeast1」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/886bb4c5-6480-12cf-c26c-f46764ac3ffb.png)

3. 読み書きルールを全て許可に変更します。お試し用なのでこれで良いでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/59456ffe-d208-4f29-6f1b-68e2489db77f.png)

## 9. Firebaseプロジェクトとアプリを紐つける
1. アプリのパッケージ名をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/13416370-5719-f474-0223-aa70a406ab10.png)


2. プロジェクト概要ページからAndroidアプリを登録します。
ここで先程コピーしたパッケージ名を使用します。
登録中に「google-services.json」をDLしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/57ddbc86-8049-0bd8-5bb2-b6ee4e7c51f4.png)

3. アプリ登録時にDLした「google-services.json」を```Assets/StreamingAssets```以下に置きます。何故か「google-services-desktop.json」も出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/de249b5a-a3f6-ec2e-1432-814dcfcf09f4.png)

## 10. ビルド
AndroidスマホをPCに繋げてUnityでapkをビルドします。

## 11. 街へ繰り出す
その辺の公道に繰り出し、アプリの動作確認をしましょう。風船を追加してそれを遠くから見て位置がずれていなければ成功です！地球トラッキング最高！

## 12. 測位情報を見る
画面上部には現在の測位情報が表示されています。

「acc」は精度を表しています。良い環境ならLAT/LNGの精度は0.5度、ALTITUDE(高度)の精度は0.2~4mくらいに収まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/9848fd49-af71-92f1-8057-c38470fd3bf5.png)

## 13. Firestoreに溜まったレコードを見る
バルーンを配置した状態でFirestoreの中身を確認すると配置場所などが記録されたレコードが溜まっているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/0a42e9da-905a-46a4-2e5a-eb1859d70c91.png)

# 終わりに
Geospatial APIを使えば緯度経度高度を指定してオブジェクトを配置できるので道案内や観光案内アプリに活用できそうです。事前に環境のスキャンがいらない(Googleさんがやってくれている為)のは外での位置合わせではかなりのメリットではないでしょうか。