PLATEAU SDK for Unityを使って久留米を歩いてみようハンズオン(1) - 環境構築, 導入

# 前書き :ramen: 
お昼に美味しくないラーメンを食べて郷愁に駆られて散歩したい気分になったので地元を散歩できるゲームを作ろうと思います。

PLATEAUという国交省が主導しているプロジェクトで日本全国の様々な都市の3Dモデルや関連データセットが提供されています。
また、そのデータをゲームエンジンUnity上で取り扱うための仕組みも公式に提供されています。

今回はこれを利用してバーチャル久留米お散歩ゲームを作ってみようと思います。

ハンズオン形式で複数回に分けて作成していくので、各々の好きな街に行ってみましょう。
第1回目は環境構築からUnity上に久留米市の3Dマップを表示するところまでを目指します。

<details><summary> PLATEAUとは </summary>

> PLATEAUは、日本の国土交通省が推進する3D地理空間データプラットフォームで、都市計画や防災、観光など多様な用途に対応しています。全国の地理情報を統合し、リアルタイムで活用できる環境を提供。地域の魅力を引き出し、持続可能な発展を支援することを目的としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/fd6471c4-a716-5ec6-08cd-4bf9cf708252.png)

詳しいことは公式サイトを参照ください

https://www.mlit.go.jp/plateau/

</details>

<details><summary> Unityとは</summary>

> Unityは、ゲームやアプリの開発を支援するクロスプラットフォームのリアルタイム3Dエンジンです。ユーザーは豊富なツールとリソースを利用して、高品質なグラフィックスやインタラクティブな体験を作成できます。ゲームだけでなく、映画、建築、教育など多岐にわたる分野で活用されており、開発者コミュニティも活発です。初心者からプロまで幅広いユーザーに支持されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/e8ebd9dd-8050-3c5b-8b10-4ac4dcd958e0.png)

これも詳しくは公式サイトなどをご参照ください

https://unity.com/ja


</details>


# 事前準備 :gear: 
環境早見表
```
Unity                 : 2022.3.34f1 (2021.3.30以上ならOKなはず)
PLATEAU SDK for Unity : 2.3.0
```
全体的にPLATEAU公式のマニュアルを参考に進めます。図解付きでそっちのほうが分かりやすいかも？

https://project-plateau.github.io/PLATEAU-SDK-for-Unity/

Unityの環境構築、PLATEAU SDK for Unityの取得、PLATEAUデータのダウンロードが主な工程です。


## Unityの環境構築
公式を参考にUnityHubからインストールしましょう。

https://docs.unity3d.com/ja/2018.4/Manual/GettingStartedInstallingHub.html

ざっくりまとめ
1. Unityのアカウントを作成
1. UnityHubをインストール
1. UnityHubからUnityEditorをインストール


## PLATEAU SDK for Unityの取得
https://assetstore.unity.com/packages/tools/utilities/plateau-sdk-for-unity-245703

こちらのアセットをMy Assetsに追加しましょう。

## PLATEAU都市データのダウンロード
PLATEAUのオープンデータページにアクセスします。ここで自分の好きな街を選択してダウンロードします。

https://www.mlit.go.jp/plateau/open-data/

久留米市を選択するとこちらのページに飛びます。

https://www.geospatial.jp/ckan/dataset/plateau-40203-kurume-shi-2020

画面をスクロールして下の方にあるデータ群から「CityGML」の詳細からダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/d83e45b5-d51a-0c14-cfc0-c235681d0e6c.png)

Zipファイルがダウンロードされるので適当な場所に適当な名前で解凍しておきましょう。2020年度の久留米市のデータらしいので「kurume-2020」としておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/498d4eda-4ef7-ca8d-8027-9ad9f86962e4.png)

これで準備は完了です。

# 制作 :tools: 
ここから実際に作っていきます。
Unity Hubでのプロジェクト作成、Unity Editorでのシーン作成、都市データの読み込みが主な内容です。

## Unityプロジェクトの作成
Unity Hubから「New Project」をクリックしてプロジェクトの作成画面へ移りましょう。
ここでは「3D(Built-in Render Pipeline)」を選択します。Project nameは元の「My project」から分かりやすいものにしましょう。私は「KurumeWalk」としました。
設定が済んだら「Create Project」をクリックしてプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/8fd41725-bbc9-f5f3-e574-e08f279733a8.png)

プロジェクトを作成するまでPCの性能にも寄りますが数分から10数分程度待ちます。
Unityの黒い画面が立ち上がったら、まずは作業用のシーンを作成しましょう。
画面左下の「Project」ウィンドウでフォルダやファイルの管理ができます。
最初から存在している「Assets/Scenes」ディレクトリで右クリックをして「Create > Scene」で新規シーンを作成します。シーン名は「WalkScene」とでもしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/6d8a90aa-4d47-4328-1396-a83a181e0f03.png)


# PLATEAUのデータをUnityに適用
Unityのプロジェクトが開いたら画面上部のバーから「Window > Package Manager」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/a5ebaad0-c061-3b6a-93ac-299f85de6270.png)

Package Managerウィンドウが開いたら、「PLATEAU SDK for Unity」を選択して`download`して、`import`します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/f9ec1032-5610-5f64-876d-bf1480507fd4.png)

インポート用の画面が開いたら、全てにチェック☑を入れた状態でウィンドウ右下の「Import」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/0c65e509-de57-ceff-ae00-cb0dfe322612.png)

Projectウィンドウで「PLATEAU」と検索してみて色々表示されていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/2ac5755d-f3c9-4553-e3b0-a2224673d496.png)

画面上部のバーにも新しく「PLATEAU」という項目が増えていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/983f2e50-f3d8-ba18-7c2a-7f6bf1af4461.png)

ここから「PLATEAU SDK」をクリックすると次のようなウィンドウが開きます。
基準座標系は自身の選択した地域に即したものを選択しましょう。今回は福岡県久留米市なので「02.福岡, 佐賀(略)」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/80f6295d-501e-5731-be10-e25a935aeabe.png)

入力フォルダの参照をクリックして、ダウンロードしてZipを解凍したフォルダを選択しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/033d0436-d061-9e7e-628a-2066a6efa038.png)

基準座標系とフォルダを選択したら、マップとして利用する範囲を選択していきます。
UnityのSceneビューの方でエリアの選択ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/366417d1-a827-4966-1380-a26844b43afe.png)

マウスホイールなどで拡大縮小できるので自分の散歩したいエリアを選択しましょう。今回は[大砲ラーメン](https://www.taiho.net/)や[清陽軒](https://seiyo-ken.jp/)、[沖食堂](https://welcome-kurume.com/spots/detail/0ab4aad4-48fb-49ed-b8eb-b5a0f83fbd47)などを含めたいので西鉄久留米駅からJR久留米駅周辺のエリアを選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/9ae9a862-7409-bb71-88f1-2ebf89454f5a.png)

エリアを決定すると様々な設定項目が現れます。今回はお試しということで初期設定のまま何も変更せずに使っていきます。
設定が終わったら「インポート」をクリックしていよいよ街の情報を取り込んでいきます。選択したエリアにも依りますが時間がそこそこかかるので気長に待ちます。
ここの長さを短縮したい人はエリアを狭めにするとか、諸々いろんな情報を削るとか小さくするとかしてみても良いかもです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/43e9b963-57a9-eaf8-d110-bb3f0b2fd5ce.png)


色々でてる全部が100%完了になったら完璧です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/5c85591f-052a-edff-757a-7814371ad554.png)

## 動作確認

久留米市役所が見えます。
テクスチャがないので簡素な見た目ですが形はしっかりしてるので脳内補完でなんとかなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/6080f384-8187-7632-e772-9a836e4e4040.png)


# まとめ
今回は街歩きゲームを作る第1歩としてチュートリアル的にデータの取り込みをしてみました。
ここまではほぼ[PLATEAU公式のマニュアル](https://project-plateau.github.io/PLATEAU-SDK-for-Unity/)通りです。
想像以上にマニュアルがしっかりしているのでPLATEAUを十全に活用するためには通しで読んでおくことをオススメします。

PLATEAU公式からまとめ記事があったり、アドカレをしていたりなどなど、国交省もなかなか力を入れているようで今後の発展にも期待できます。


https://qiita.com/uchiyama_MLIT/items/72c2886cf3ff988cdfe7 

次回からはマニュアルの先へ行きましょう。

このままではプログラムは何も書いていないのでゲームらしい動作は何もできません。
C#でプレイヤーの制御のためのプログラムを書いたり、PLATEAUの持っている情報を参考にアイテムやランドマークを置いてみたりしたいですね。
現在表示されているデータを見てみると何やら使えそうことが書いてあります。
これをゲームに活用していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884897/d9226a62-b623-c119-d3e8-9a2241b6def5.png)


<details><summary> CityObjectGroupが持っているデータ </summary>

```yaml
{
  "rootCityObjects": [
    {
      "gmlID": "bldg_f5c215ad-b343-4b9b-b6fa-68cbdadc81d0",
      "cityObjectIndex": [
        0,
        0
      ],
      "cityObjectType": "COT_Building",
      "attributes": [
        {
          "key": "bldg:measuredheight",
          "type": "Double",
          "value": "90.7"
        },
        {
          "key": "bldg:storeysaboveground",
          "type": "Integer",
          "value": "20"
        },
        {
          "key": "bldg:storeysbelowground",
          "type": "Integer",
          "value": "0"
        },
        {
          "key": "bldg:usage",
          "type": "String",
          "value": "官公庁施設"
        },
        {
          "key": "bldg:yearofconstruction",
          "type": "Date",
          "value": "1992"
        },
        {
          "key": "gml:name",
          "type": "String",
          "value": "久留米市役所"
        },
        {
          "key": "uro:buildingDataQualityAttribute",
          "type": "AttributeSet",
          "value": [
            {
              "key": "uro:lod1HeightType",
              "type": "String",
              "value": "航空写真図化_最高高さ"
            }
          ]
        },
        {
          "key": "uro:buildingDetailAttribute",
          "type": "AttributeSet",
          "value": [
            {
              "key": "uro:areaClassificationType",
              "type": "String",
              "value": "市街化区域"
            },
            {
              "key": "uro:buildingFootprintArea",
              "type": "Double",
              "value": "1420.61"
            },
            {
              "key": "uro:buildingHeight",
              "type": "Double",
              "value": "69.57"
            },
            {
              "key": "uro:buildingStructureOrgType",
              "type": "String",
              "value": "鉄筋コンクリート"
            },
            {
              "key": "uro:buildingStructureType",
              "type": "String",
              "value": "鉄筋コンクリート造"
            },
            {
              "key": "uro:districtsAndZonesType",
              "type": "String",
              "value": "商業地域"
            },
            {
              "key": "uro:orgUsage",
              "type": "String",
              "value": "官公庁施設"
            },
            {
              "key": "uro:specifiedBuildingCoverageRate",
              "type": "Double",
              "value": "0.8"
            },
            {
              "key": "uro:specifiedFloorAreaRate",
              "type": "Double",
              "value": "4"
            },
            {
              "key": "uro:surveyYear",
              "type": "Integer",
              "value": "2016"
            },
            {
              "key": "uro:totalFloorArea",
              "type": "Double",
              "value": "23227.03"
            },
            {
              "key": "uro:urbanPlanType",
              "type": "String",
              "value": "都市計画区域"
            }
          ]
        },
        {
          "key": "uro:buildingDisasterRiskAttribute",
          "type": "AttributeSet",
          "value": [
            {
              "key": "uro:depth",
              "type": "Double",
              "value": "0.23"
            },
            {
              "key": "uro:rank",
              "type": "String",
              "value": "0.5m未満"
            },
            {
              "key": "uro:rankOrg",
              "type": "String",
              "value": "0.3m未満"
            }
          ]
        },
        {
          "key": "uro:buildingDisasterRiskAttribute2",
          "type": "String",
          "value": ""
        },
        {
          "key": "uro:buildingIDAttribute",
          "type": "AttributeSet",
          "value": [
            {
              "key": "uro:buildingID",
              "type": "String",
              "value": "40203-bldg-68911"
            },
            {
              "key": "uro:city",
              "type": "String",
              "value": "福岡県久留米市"
            },
            {
              "key": "uro:prefecture",
              "type": "String",
              "value": "福岡県"
            }
          ]
        },
        {
          "key": "uro:description",
          "type": "String",
          "value": "有明海沿岸高潮浸水想定区域図"
        },
        {
          "key": "uro:largeCustomerFacilityAttribute",
          "type": "AttributeSet",
          "value": [
            {
              "key": "uro:surveyYear",
              "type": "Integer",
              "value": "2016"
            }
          ]
        },
        {
          "key": "土地利用用途",
          "type": "String",
          "value": "公益施設用地"
        }
      ]
    }
  ],
  "outsideParent": "",
  "outsideChildren": [
    "UUID_b017fdd1-34a0-46c1-bfaf11f5b9497512",
    "UUID_d6c10d47-1a1a-4382-a71e4f875c993e1e",
    # (中略) 
    "UUID_f63c822c-2a90-4466-9ad2d64f35ab3188"
  ]
}

```

</details>



# 連載記事一覧
[第1回「環境構築, 導入」](https://qiita.com/Sane21/items/7ab878b5f0efdd8ec61e)
[第2回 「プレイヤーを作ってTPS風に動かそう」](https://qiita.com/Sane21/items/8595e25b5536c317fabd)
第3回 建物に衝突するようにするか、見た目を整えるようにするかどっちかやります