【Unity】PLATEAU SDK for Unityの基本的な利用方法～利用時の注意点

## PLATEAU SDK for Unity
Unity向けにPLATEAUの都市モデルのインポートをサポートするSDKです。

## バージョン情報
| 諸々名前 | バージョン |
|:-:|:-:|
|  Unity | 2020.3.4f1  |
|  PLATEAU SDK for Unity | 0.5.1  |

## 基本的な利用方法
(個人的に勝手に期待していたこととして)**緯度経度および範囲指定など行えば都市モデルをランタイムでロードする機能**についてはサポートされていません。

というかそのようなUnity×ランタイムロードの部分はおそらくこのSDKがサポートするという話は今後もなく、`事前インポートにおける処理の重さ`や`範囲指定してモデルを取得するまでの難解なフロー`についてを解決してくれるツールだと思います。(勝手な推測)

その点を踏まえてこのSDKで試したことの流れとしては以下になります。
1. UnityにPLATEAU SDK for Unityを導入する
2. CityGMLを[G空間情報センターのWebページ](https://www.geospatial.jp/ckan/dataset/plateau-tokyo23ku)からダウンロードする
3. DLしてきたCityGMLをPLATEAU SDK for Unityを使って参照し、指定範囲のモデルデータをImportする
4. 必要に応じてImportしたモデルをExportする 

詳細な手順はドキュメントに記載があるので非常にわかりやすく、助かりました。
【参考リンク】：[PLATEAU SDK for Unity](https://synesthesias.github.io/PLATEAU-SDK-for-Unity/manual/Installation.html)

## 詰まった点
ドキュメントは導入まで非常に丁寧に書かれており、Import成功までたどり着くのにそれほど時間はかかりませんでした。その先の実機ビルドまでにいろいろ詰まったのでメモします。

---

### CityGMLのファイルサイズ
以下サイトから東京都23区のCityGMLが取得できます。
【参考リンク】：[3D都市モデル（Project PLATEAU）東京都23区](https://www.geospatial.jp/ckan/dataset/plateau-tokyo23ku)

この23区分まとめてダウンロードを行うことでマップのどの部分を取得すべきか、という範囲指定の作業が以下GIFのようにUnityEditor上で行えます。
![P.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/01278f02-f61b-1496-847a-ae37330216b9.gif)

ただ、注意点として23区分すべてのCityGMLは解凍するとかなりのデータサイズがあります。2022/12月時点で取得したデータは61.4GBと表示されました。

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/b580555a-53f9-e5ed-2ca4-c2cf438597f4.png)

「23区分もデータは要らないので、ほしいデータだけダウンロードする」というやり方も可能ですが、そうなると結局自分のほしいデータがどの区画なのか、[G空間情報センターに公開されている区画番号が記載された画像](https://www.geospatial.jp/ckan/dataset/plateau-tokyo23ku/resource/28d1efab-c1f9-4ad9-891b-4b8a4b3a99ae)とGoogleマップを交互ににらめっこする必要があります。

このあたりはトレードオフで仕方がないことなのかもしれません。
何か良い手法をご存じの方いらっしゃいましたらコメントお願いします。

---

### データの保存場所

CityGMLの情報をもとにUnityにロードされたデータはStreamingAssets配下にあります。ただし、`.PLATEAU`という隠しフォルダに配置されるため、UnityEditor上からMeshファイル、Material、Textureなどを参照することができません。
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/e948f90f-f5ea-4f70-cfa4-24a8b773fba8.png)

この影響かどうかはわかりませんが、Importの手順を経て生成されたPLATEAUモデルをPrefab化して再配置を試みた場合、MeshファイルやMaterialの参照が切れる問題に悩まされました。
![P_SDK.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/88e9f095-5205-132f-96b3-a558f7147f7a.gif)


推測ですが、そういったImportしたモデルを直接別プロジェクトや別シーンに再配置するような挙動は想定していないようです。

何かの事情で**元データをPrefab化したり、編集したいときはSDKにExport機能があるので、一度Exportして任意のフォルダに再配置する**ことをお勧めします。

---

### ビルド時のエラー
Unityのバージョン依存な話のようですが、StreamingAssetsに巨大なデータサイズのファイルが存在している場合、Androidだとエラーが出てビルドできないようです。

【参考リンク】：[AAPT2 aapt2-4.1.0-6503028-windows Daemon #1: Unexpected error during link, attempting to stop daemon. ](https://github.com/google/play-unity-plugins/issues/158)

現時点で打開策を見つけられなかったので、利用する3DモデルだけExportした後、Importしたアセット群は削除しました。

---

### モデルの持つメタデータ
PLATEAUのモデルの原点は若干ずれた位置に表示されます。

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/208f0883-f2f4-2a72-9432-3c8652955b7d.png)

個人的にこのSDKの一番ありがたい点として、これまでUnityから利用する際は以下記事のように工夫が必要だった原点のメタデータ(緯度経度など)をインスペクターに表示してくれることです。

【参考リンク】：[Geospatial APIでPLATEAUのCityGML建物モデルを配置する](https://gaprot.jp/2022/08/22/geospatial-api/)

ここで解釈を間違えてハマったこととして、高さが0になっている点です。
たしかに、この原点の位置は0を示していますが、モデルたちは微妙にこの0より高い位置にあったり、低い位置にあったりします。理由として、**PLATEAUは標高をベースに作られたモデル**であるため、この原点に比べて高低差のある位置に表示されます。

なので、GeoSpatialAPIなどの"高度"を指定してコンテンツ作りを行う場合は、PLATEAU SDKでImportしたモデルは**標高分浮いている/沈んでいる状態**であることを意識する必要があります。

【参考リンク】：[【Unity】GeoSpatialAPIの基礎理解～空間共有コンテンツ作成まで](https://qiita.com/OKsaiyowa/items/c2a2da503d71eb3af5bd#%E9%AB%98%E5%BA%A6%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

## おわりに
まだフィードバック用リリース版とのことでしたが、ハッカソンにて利用させていただき、無事優勝することができました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">・屋内規模のAR空間<br>・都市規模のAR空間<br>・VR空間<br>・現実空間<br><br>これら全ての前提条件が異なる空間同士のセッションシステムを構築しました！<br><br>家でもAR体験ができる<br>特定の場所でもできる<br>VR空間からの交流もできる<br><br>そんなわがまま詰め込みました😆<a href="https://twitter.com/hashtag/withAR%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#withARハッカソン</a> <a href="https://twitter.com/hashtag/NEUU?src=hash&amp;ref_src=twsrc%5Etfw">#NEUU</a><a href="https://twitter.com/hashtag/PLATEAU?src=hash&amp;ref_src=twsrc%5Etfw">#PLATEAU</a> <a href="https://t.co/uNCiJ5gdGO">pic.twitter.com/uNCiJ5gdGO</a></p>&mdash; KENTO⚽️XRエンジニア😎Shader100記事マラソン挑戦中82/100 (@kento_xr) <a href="https://twitter.com/kento_xr/status/1604380515196600320?ref_src=twsrc%5Etfw">December 18, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ハッカソンは短い期間でしたが、PLATEAU SDK for Unityで大きく進捗を阻まれることなく非常に使いやすいツールでした。今後も利用させてもらいます。ありがとうございます。

(他にも同じ声があれば検討していただきたいこととして、緯度経度と範囲入力したらランタイムで取得できる、みたいな機能を公開してくれたらすごくうれしいです)