Plateauで身近な地域の地図建物情報をUnityにとりこみ、簡易ドローンシュミレーターを作ってみた

　暖かくなったら、ドローンに挑戦しようか？といろいろ情報を集めているうちに、Unityを使ってドローンシュミレーターを作っているものがあった。
https://hajime-drone.itch.io/globexplore
https://store.steampowered.com/app/2635620/GlobeXplore/?l=japanese
 今回自分で簡易ドローンシュミレーションを作ろう、と思ったのは、このソフトに刺激されたからに他ならない。

　そのソフトの背景は、仮想空間ではなく、現実の地図を用いたもので親しみやすかった。ただ、実際やってみると、なかなかうまく動かせなかった。最初の「ゲームコントローラー」の設定がなかなかうまくいかなかった。本物のドローン飛行では、ゲームコントローラーに相当しるものは「プロポ」と呼ばれるらしい。このシュミレーターは、「プロポ」の設定には適しているのかもしれない（説明では、「ゲームコントローラー」でもできます、とのことだったが）。
 
　調べると、多くの「ゲームコントローラー」の左右の動きは共通しているとあったし、実際手元の「ゲームコントローラー」2つをTester
https://hardwaretester.com/gamepad
で試すと、左右の上下作左右の動きは共通だった。

![Tester.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/3237f42c-21a5-4b89-9cd4-2a6e0f148036.jpeg)

　Gamepad Testerでみると：右joystickの右左はAxis2（x軸にそってUnity上のオブジェは移動、としたい）、上下はAxis3（ｚ軸にそってUnity上のオブジェは移動、としたい）。左joystickの右左はAxis０（ｙ軸を中心として、をUnity上のオブジェは回転、としたい）、上下はAxis１（ｙ軸にそってUnity上のオブジェは移動、としたい）。
 
　逆に「プロポ」は今手元にないので、ＰＣのキー操作に加えて、「ゲームコントローラー」の右のスチック操作で、シュミレーション上のドローンオブジェクトの前後（ピッチ）、左右（ロール）の動きを、左のスチック操作で上下（スロットル）、回転（ヨー）の動きができるようにすることを目標とした。
　また、このシュミレーションゲームの外国の観光地の街並みはそこそこ綺麗だった。調べるとGoogleからはオフラインでは難しいと。するとMapboxかOpenStreetMap？
　ところで、調べると、最近Plateauという日本の地図情報が国交省主導で整備され、災害シュミレーション、人流の大きさ表示等につかわれているとのこと。
　ドローンシュミレーションするなら、仮想空間＜住んだことあって知っている町、のほうがもしかしたら楽しいかもしれない。
　とはいえ、まだPlateauの情報はさびしいく建物は白黒、直方体が主。なら仮想空間のほうがいい？いや、でも、人は記憶で、その「寂しさ」をおぎなえるかもしれない。
　ということで、Plateauで身近な地域の地図建物情報をUnityにとりこみ、簡易ドローンシュミレーターを作ってみることにした。
 　
（１）  Plateauより街情報
　https://stella-international.co.jp/media/plateau/　
　https://www.mlit.go.jp/plateau/about/　

　Unityにその情報をとりこむためにSDK
　https://assetstore.unity.com/packages/tools/utilities/plateau-sdk-for-unity-245703　
　https://www.mlit.go.jp/plateau/learning/tpc17-1/#p17_1　
をUnityにとりこみ、そこからリンクしている情報をたよりに、身近な街の地図建物情報をUnityにとりこんだ。余計な情報は、とりこまないようにしたが、Mesh Colliderはつけられるということなので、それはつけることにした。地図上（ https://www.geospatial.jp/ckan/dataset/plateau ）
３～４区画をとりこむのに３０分くらいかかるかも、という情報もあったが、最近購入したぼくのＰＣでは３分ほどでUnityへのとりこみが完了した。
 
（２）  Unity上のドローンオブジェクトは、Create→３Ｄobject→Cylinderをつくり、縦方向に縮小して円板状のものとした（本当は、BlenderとかでつくったりAssetSoreから購入すればいいのだろうが）。ドローンオブジェクトはmaterialを黄色で作成し、それをアタッチした、さらに、ドローンオブジェクトにCapsule collider, rigidbody　(Gravityはオフ)　をアタッチ.
 
（３）ドローンオブジェクトを動かすために、そこにアタッチするＣ＃スクリプトは２種類つくった。
①ＰＣキーボードの、↑↓→←ＷＳＡＤへのキーへ操作をわりふるもの。
②「ゲームコントローラー」の左右のスチックに操作をわりふるもの。
　　
　ここでいつものようにChatGPTのお世話になりキー操作のＣ＃スクリプトを作成。（ただ、このキー操作のＣ＃スクリプトは２種類の系統があるようだ）。できたＣ＃スクリプトを、ドローンにみたてた円盤シリンジobject（ドローンオブジェクト）にアタッチ：ドローンオブジェクトのComponentとして付け加える。
　それぞれのスクリプトを使うために各々別の二つプロジェクトを作成した。
 
（４）  main cameraをドローンオブジェクトの「子」にする.
そして、子にしたmain controlの位置調整、カメラの角度調整をする。
　　（最初は、main cameraにそれを動かすＣ＃スクリプトをアタッチしていて、それでいいようであったが、collider, rigidbodyがつけられないなどの問題があり。そこでドローンをつくり、そのドローンに動かすためのＣ＃スクリプトをアタッチ。main cameraをドローンオブジェクトの「子」にして、子にしたmain controlの位置調整、カメラの　角度調整で、いわゆるFPV　(First Person View)　を実現した。この細かい調整は少しとまどったが、少し調べてすぐできた。）
　　
（５）２つのプロジェクトのうち、①ＰＣキーボードの、↑↓→←ＷＳＡＤへのキーへ操作をわりふるもの。は比較的スムーズに完成までもっていけた。

　だが、もう一つのプロジェクト②「ゲームコントローラー」の左右のスチックに操作をわりふるもの、は作成に難渋した。
　この後者について、ここでは特に書いていく。
　②のプロジェクトでは、「C＃スクリプト作成」だけではたりず、さらに「ゲームコントローラー」の左右のスチックの動きをUnityに物理的につたえるInputシステムをつくらねばならなかったのだった。
　　「スチックの動きをUnityが認識するが、それがオブジェクトの動きに伝達できない」という状態を打開するのに、試行錯誤する時間は長かった。（画面のないChatGPTの弱点か？）
 
→完成形の写真　(図)ｘ２ 
![(Assets)Input.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/86a51395-d3e3-48b4-a130-b0e27c4068ff.jpeg)

中央：Assets/Input/DroneControls.inputactionsの中に注目。ActionMapsの中に、DroneControlがあり、そのDroneControlのActionsにMoveLeftStick、MoveRightStickがある。それぞれにbindingを設定（今回は手動）。
　
![(Inspector)PlayerInput.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/35e639fb-7a21-414c-b2db-aa6b142e8300.jpeg)

ここは、画面右のゲームオブケクトのInspectorに注目（CylinderのInspector/PlayerInput/Events/DroneControlの部分）


（６）修飾
　Directional Light を回転させて昼夜を再現する。
　Unityの Directional Light を回転させることで、時間の経過に応じた昼夜の変化 を作る。
 
1. 基本の仕組み
　Directional Light を 太陽または月の役割 にする。
　スクリプトで 時間の経過に応じて回転 させる。
　角度を変えることで、朝・昼・夜の光の変化を再現。
2. スクリプトを作成
　スクリプトを SunCycle.cs という名前で作成し、Directional Light にアタッチ。
３． 実装後の調整
　Directional Light を選択
　SunCycle スクリプトを Inspector に追加
　Sun Light に Directional Light をドラッグ＆ドロップ
　光の色を設定する（Gradient の作成）
 　　Inspector で Light Color Gradient の横にある [New] をクリック
 　　Gradient のキーを設定
　　　　左端（夜）：青 (#003366)
　　　　中央（朝夕）：オレンジ (#FF8800)
　　　　右端（昼）：白 (#FFFFFF)
 　　　　Color Mode を Blend にする（スムーズな色変化） 


![昼.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/f7c47046-5cc8-4319-8663-59957abb79e7.jpeg)

今回、画面上は１分で１日経過夜（0時） → 青っぽい光 & 弱い朝（6時） → オレンジ色の光 & 強くなっていく昼（12時） → 白色の光 & 一番明るい夕方（18時） → オレンジ色 & 弱くなっていく夜（24時） → また青っぽく & 暗くなる
 

![夕.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/c3976053-0a32-4a4f-8688-2398f3c33869.jpeg)

![夜.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/14100e34-a1e4-438d-9ff4-89b37559770b.jpeg)

ここまでで、
PCのキーでドローンが動くプロジェクト、「ゲームコントローラー」でドローンが動くプロジェクトが、ともに形になった。背景の街並みが、１分間で昼夜をくりかえす、ことは共通である。

 
(参考)　今回HDRPの導入にも挑戦したが、当初使用したUnity Versionが2022.3.21f1のことが影響してか、まったくうまくいかず。そこで、最新Version:6000.0.3f1で再挑戦した。下記は、HDRP*　をつかった「HDRI Sky」のさわりである。
　夕暮れ、空には雲が描かれ、遠くに樹がみえている。
　しかし、光の問題、雲の動きの問題等、これを使うのは、相当やっかいそうな印象をもった。 

![HDRP1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/8888b25e-a24c-4735-9561-2b66b76fee47.jpeg)

*The High Definition Render Pipeline (HDRP) is a high-fidelity Scriptable Render Pipeline built by Unity to target modern (Compute Shader compatible) platforms. HDRP utilizes Physically-Based Lighting techniques, linear lighting, HDR lighting, and a configurable hybrid Tile/Cluster deferred/Forward lighting architecture and gives you the tools you need to create games, technical demos, animations, and more to a high graphical standard.

一応、昼夜で HDRI Sky が自動で切り替わるところまではできた。

![HDRP2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/05ee03c3-b704-4a66-986f-933e9422e8e8.jpeg)

![HDRP3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/0be338bd-8e11-49bb-b8bd-fffad6b7a61c.jpeg)