
Plateauで身近な地域の地図建物情報をUnityにとりこみ、簡易ドローンシュミレーターを作ってみた
暖かくなったら、ドローンに挑戦しようか?といろいろ情報を集めているうちに、Unityを使ってドローンシュミレーターを作っているものがあった。
https://hajime-drone.itch.io/globexplore
https://store.steampowered.com/app/2635620/GlobeXplore/?l=japanese
今回自分で簡易ドローンシュミレーションを作ろう、と思ったのは、このソフトに刺激されたからに他ならない。
そのソフトの背景は、仮想空間ではなく、現実の地図を用いたもので親しみやすかった。ただ、実際やってみると、なかなかうまく動かせなかった。最初の「ゲームコントローラー」の設定がなかなかうまくいかなかった。本物のドローン飛行では、ゲームコントローラーに相当しるものは「プロポ」と呼ばれるらしい。このシュミレーターは、「プロポ」の設定には適しているのかもしれない(説明では、「ゲームコントローラー」でもできます、とのことだったが)。
調べると、多くの「ゲームコントローラー」の左右の動きは共通しているとあったし、実際手元の「ゲームコントローラー」2つをTester
https://hardwaretester.com/gamepad
で試すと、左右の上下作左右の動きは共通だった。

逆に「プロポ」は今手元にないので、PCのキー操作に加えて、「ゲームコントローラー」の右のスチック操作で、シュミレーション上のドローンオブジェクトの前後(ピッチ)、左右(ロール)の動きを、左のスチック操作で上下(スロットル)、回転(ヨー)の動きができるようにすることを目標とした。
また、このシュミレーションゲームの外国の観光地の街並みはそこそこ綺麗だった。調べるとGoogleからはオフラインでは難しいと。するとMapboxかOpenStreetMap?
ところで、調べると、最近Plateauという日本の地図情報が国交省主導で整備され、災害シュミレーション、人流の大きさ表示等につかわれているとのこと。
ドローンシュミレーションするなら、仮想空間<住んだことあって知っている町、のほうがもしかしたら楽しいかもしれない。
とはいえ、まだPlateauの情報はさびしいく建物は白黒、直方体が主。なら仮想空間のほうがいい?いや、でも、人は記憶で、その「寂しさ」をおぎなえるかもしれない。
ということで、Plateauで身近な地域の地図建物情報をUnityにとりこみ、簡易ドローンシュミレーターを作ってみることにした。
(1) 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 )3~4区画をとりこむのに30分くらいかかるかも、という情報もあったが、最近購入したぼくのPCでは3分ほどでUnityへのとりこみが完了した。
(2) Unity上のドローンオブジェクトは、Create→3Dobject→Cylinderをつくり、縦方向に縮小して円板状のものとした(本当は、BlenderとかでつくったりAssetSoreから購入すればいいのだろうが)。ドローンオブジェクトはmaterialを黄色で作成し、それをアタッチした、さらに、ドローンオブジェクトにCapsule collider, rigidbody (Gravityはオフ) をアタッチ.
(3)ドローンオブジェクトを動かすために、そこにアタッチするC#スクリプトは2種類つくった。
①PCキーボードの、↑↓→←WSADへのキーへ操作をわりふるもの。
②「ゲームコントローラー」の左右のスチックに操作をわりふるもの。
ここでいつものようにChatGPTのお世話になりキー操作のC#スクリプトを作成。(ただ、このキー操作のC#スクリプトは2種類の系統があるようだ)。できたC#スクリプトを、ドローンにみたてた円盤シリンジobject(ドローンオブジェクト)にアタッチ:ドローンオブジェクトのComponentとして付け加える。
それぞれのスクリプトを使うために各々別の二つプロジェクトを作成した。
(4) main cameraをドローンオブジェクトの「子」にする.
そして、子にしたmain controlの位置調整、カメラの角度調整をする。
(最初は、main cameraにそれを動かすC#スクリプトをアタッチしていて、それでいいようであったが、collider, rigidbodyがつけられないなどの問題があり。そこでドローンをつくり、そのドローンに動かすためのC#スクリプトをアタッチ。main cameraをドローンオブジェクトの「子」にして、子にしたmain controlの位置調整、カメラの 角度調整で、いわゆるFPV (First Person View) を実現した。この細かい調整は少しとまどったが、少し調べてすぐできた。)
(5)2つのプロジェクトのうち、①PCキーボードの、↑↓→←WSADへのキーへ操作をわりふるもの。は比較的スムーズに完成までもっていけた。
だが、もう一つのプロジェクト②「ゲームコントローラー」の左右のスチックに操作をわりふるもの、は作成に難渋した。
この後者について、ここでは特に書いていく。
②のプロジェクトでは、「C#スクリプト作成」だけではたりず、さらに「ゲームコントローラー」の左右のスチックの動きをUnityに物理的につたえるInputシステムをつくらねばならなかったのだった。
「スチックの動きをUnityが認識するが、それがオブジェクトの動きに伝達できない」という状態を打開するのに、試行錯誤する時間は長かった。(画面のないChatGPTの弱点か?)
→完成形の写真 (図)x2


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



ここまでで、
PCのキーでドローンが動くプロジェクト、「ゲームコントローラー」でドローンが動くプロジェクトが、ともに形になった。背景の街並みが、1分間で昼夜をくりかえす、ことは共通である。
(参考) 今回HDRPの導入にも挑戦したが、当初使用したUnity Versionが2022.3.21f1のことが影響してか、まったくうまくいかず。そこで、最新Version:6000.0.3f1で再挑戦した。下記は、HDRP* をつかった「HDRI Sky」のさわりである。
夕暮れ、空には雲が描かれ、遠くに樹がみえている。
しかし、光の問題、雲の動きの問題等、これを使うのは、相当やっかいそうな印象をもった。

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

