UnityでポケモンGoもどきを作りたい(5)現在地取得と逆ジオコーディングを写経してみる
前回は、JDKとAndroidStudioをインストールした後、Unityで初期設定を行い、Unityで作ったゲームをAndroidアプリにビルドしてみました。
今回は、以下のサイトを写経して、GPSによる現在地の取得と、緯度と経度から現在の住所を表示することを、Unity上でやってみたいと思います。
https://qiita.com/mintcandy/items/9aa274044af646a1d5bc
- 1. 開発環境
- 2. どんなゲームを作ろうとしているのか
- 3. Unityで現在地&住所取得アプリ作成の流れ
- 4. 新規Unityアプリの作成
- 5. Build SettingsをWebGL(600×800)に設定
- 6. テキスト表示用オブジェクトLonLatInfoの作成
- 7. Noto Sans CJK JPのダウンロードとUnityへの設定
- 8. LonLatManager(空のオブジェクト)の作成と3つのスクリプトの作成
- 9. スクリプト(1)現在地取得
- 10. スクリプト(2)逆ジオコーディングで市区町村名を取得(後でMiniJSONアセットが必要)
- 11. スクリプト(3)テキストUIに表示
- 12. 3つのスクリプトをLonLatManagerオブジェクトにアタッチ
- 13. WebGLでビルド
- 14. Netlifyにデプロイ、AndroidビルドするもGPS取得はうまくいかず
- 15. ソースコード
開発環境
Windows 10 Pro 1803
Unity Hub 2.1.0
Unity 2019.2.0f1
Unityのインストール方法についてはこちらに記載させていただきました。
どんなゲームを作ろうとしているのか
画面に、以下の3つの情報を1秒おきに表示したいと思います。
- 緯度
- 経度
- 住所
Unityで現在地&住所取得アプリ作成の流れ
以下のような流れでやってみたいと思います。MiniJSONというアセットを用います。(参考: @phi 2014年12月18日に投稿 [Unity] MiniJSON 使って json 読み込み)
- 新規Unityアプリ(3D)作成
- Build SettingsをWebGL(600×800)に設定
- テキスト表示用オブジェクトLonLatInfoの作成
- Noto Sans CJK JPのダウンロードとUnityへの設定
- LonLatManager(空のオブジェクト)の作成と3つのスクリプトの作成
- MiniJSONアセットのUnityへの追加とLonLatManagerへ追加
- WebGLでビルド
- Netlifyにデプロイ
新規Unityアプリの作成
UnityHubを起動し、右上の方の、『新規作成』をクリックして、アプリを作成します。
名前は、unity-gps とします。
以下のような画面になります。
Build SettingsをWebGL(600×800)に設定
ツールバーで、File > Build Settings… ののち、以下のように設定します。
テキスト表示用オブジェクトLonLatInfoの作成
Hierarchyタブで、Create > UI > Text の順にクリック
生成されるText を LonLatInfo という名前に変更し、位置や大きさなどを調整します。
Noto Sans CJK JPのダウンロードとUnityへの設定
日本語可能なフォントの設定。Noto Sans CJK JPなどの、日本語を含むフォントを設定します。
https://www.google.com/get/noto/#sans-jpan から、Noto Sans CJK JPのフォントのZIPファイルをダウンロードして解凍します。
ダウンロードされたNotoSansCJKjp-hinted.zip をダブルクリックで開き、中にある『NotoSansCJKjp-Light.otf』をいったん、ダウンロードフォルダなどの別の場所に移動した後、さらに、Unityの『Projectタブ』の中にドラッグ&ドロップします。
次に、Projectタブ内にできたNotoSans…を、先ほどのLonLatInfoを選択した状態で、Inspectorタブの、
Text(Script) > Character > Font の Arialとなっているところへドラッグ&ドロップ。
すると、以下のようになります。
Main Cameraを触って、背景を単一色にしておきます。
LonLatManager(空のオブジェクト)の作成と3つのスクリプトの作成
Hierarchyタブで、Create > Create Empty の順にクリック
GameObject というオブジェクトが作成されるので、この名前を、LonLatManager に変更。
(変更前)
(変更後)
スクリプト(1)現在地取得
Projectタブの中で、右クリック > Create > C# の順にクリックして新規C#スクリプトを作成後、名前を、LonLatGetter に変更します。ダブルクリックして編集します。
以下のコードに書き換えます。(引用元:Unityで位置ゲーを作るために必要な技術 その1 現在地取得と逆ジオコーディング)
float : 数値型 実数型 浮動小数点型(32bit) → 要は、『小数』ということでよさそうです
public float Longitude { get; private set; } → この { } がよくわかりません。いつか調べてみたいと思います。
IEnumerator :
http://stickpan.hatenablog.com/entry/2014/04/25/145210
2014-04-25
Unityで使うIEnumerator
https://qiita.com/vc_kusuha/items/2048391d821cb94fa489
@vc_kusuha
2019年01月31日に投稿
[C#]IEnumeratorとIEnumerableを調べた
(変更前)
(変更後)
作成したLonLatGetter.csを、Assetsタブ内から、Hierarchyタブ内のLonLatManager にドラッグ&ドロップします。
スクリプト(2)逆ジオコーディングで市区町村名を取得(後でMiniJSONアセットが必要)
こちらのサイトのAPIを使用します。
経度と緯度を送ると、住所コードや文字列が返ってきます。
ちなみに、後で、MiniJSONというアセットを追加する必要があります。
Projectタブの中で、右クリック > Create > C# の順にクリックして新規C#スクリプトを作成後、名前を、LonLatToAddr に変更します。ダブルクリックして編集します。
以下のコードに書き換えます。(引用元:Unityで位置ゲーを作るために必要な技術 その1 現在地取得と逆ジオコーディング)
(変更前)
(変更後)
MiniJSONを用いるために、
https://gist.github.com/darktable/1411710
から、MiniJSON.csをダウンロードしてProjectタブ > Plugins フォルダに入れます。
まず、UnityでProjectタブで、右クリック > Create > Folder の順にクリックして、Folder名をPlugins に変更します。
Pluginsフォルダをダブルクリックして開きます。
ProjectタブのAssets>Plugins の中で右クリック > create > C# Script として、名前を MiniJSON に変更します。
出来上がったMiniJSONをダブルクリックして開きます。
MiniJSON.csが開かれるので、
https://gist.githubusercontent.com/darktable/1411710/raw/d7c8c5fd25d86031e52883f4e69c31234b5e735c/MiniJSON.cs
のコードをコピペします。
(変更前)
(変更後)
上記により、LonLatToAddr.cs にあった赤線(エラー)が消えます。がしかし、WWWのところに緑線が残っています。まあ、今回は、気にしないことにします。
WWWについて
参考: 【UNITY】WWWクラスで通信を行おう!画像やデータを取ってこよう sato 2019/1/8
スクリプト(3)テキストUIに表示
取得した緯度、経度、住所文字列の情報を表示するUIの処理を実装します。
Projectタブの中で、Assetsフォルダに戻り、右クリック > Create > C# の順にクリックして新規C#スクリプトを作成後、名前を、LonLatToUI に変更します。ダブルクリックして編集します。
以下のコードに書き換えます。(引用元:Unityで位置ゲーを作るために必要な技術 その1 現在地取得と逆ジオコーディング)
(変更前)
(変更後)
3つのスクリプトをLonLatManagerオブジェクトにアタッチ
Projectタブ内のLonLatGetter.cs、LonLatToAddr.csとLonLatToUI.csの3つのスクリプトを、Hierarchyタブ内のLonLatManagerオブジェクトにドラッグ&ドロップします。
こんな感じになります。
WebGLでビルド
File > Build Settings… から、Build and Run をクリックします。すごく時間がかかります。
パソコンではうまくいきませんでした。。。(GPSがついていないからかもしれません。)
Netlifyにデプロイ、AndroidビルドするもGPS取得はうまくいかず
WebGLを出力したunityBuild/ フォルダをZIPファイルにして、Netlifyにドラッグ&ドロップして、デプロイします。(参考:)
以下のような感じになります。
https://happy-bardeen-eabfc8.netlify.com/
リンクをクリックすると
やはりパソコンではだめです。
Androidスマホで開いてみます。
ダメでした。
→Androidアプリとしてビルドしてスマホでやってみましたが、『測定不能』と出て、うまくいきませんでした。。。後で、元サイトのコードをコピペして、再度、Androidビルドしましたが、それでも以下のような画面でうまくいきませんでした。(そもそも、GPSを許可、、、の画面が出てきませんでした。)
当初は解決方法が思い当たらなかったのですが、結局、『アプリに位置情報にアクセスを許可』できていなかったのが原因であることが後でわかりました。
https://akira-watson.com/android/gps.html
[Android] GPSで位置情報を取得するアプリを作る
2019/8/14
(引用ここから)
テストのみの簡易的な方法: この実装無しでも可能です。(但し、テストのみ) アプリをインストール起動後、「設定」「アプリと通知」から該当アプリにて 「権限」から「位置情報」をOnにすれば、面倒なpermissionのチェクコードが無くても動くことは動きます。
(引用ここまで)
SH-M08 では、以下のように設定します。
設定 > アプリと通知 > アプリの権限 > 位置情報
今回は、unitygps という名前なので、以下のように、そのアプリの位置情報の権限のトグルを OFF から ON にします。
すると、ちゃんと、以下のように表示されました。
(東京駅の近くでアプリを起動した画面です。)
ソースコード
https://github.com/adash333/unity-android-gps-RevGeocoding
作成中
ディスカッション
コメント一覧
まだ、コメントがありません