スポンサーリンク

UnityでポケモンGoもどきを作りたい(5)現在地取得と逆ジオコーディングを写経してみる

2019年8月26日

前回は、JDKとAndroidStudioをインストールした後、Unityで初期設定を行い、Unityで作ったゲームをAndroidアプリにビルドしてみました。

今回は、以下のサイトを写経して、GPSによる現在地の取得と、緯度と経度から現在の住所を表示することを、Unity上でやってみたいと思います。

https://qiita.com/mintcandy/items/9aa274044af646a1d5bc

スポンサーリンク

開発環境

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 読み込み)

  1. 新規Unityアプリ(3D)作成
  2. Build SettingsをWebGL(600×800)に設定
  3. テキスト表示用オブジェクトLonLatInfoの作成
  4. Noto Sans CJK JPのダウンロードとUnityへの設定
  5. LonLatManager(空のオブジェクト)の作成と3つのスクリプトの作成
  6. MiniJSONアセットのUnityへの追加とLonLatManagerへ追加
  7. WebGLでビルド
  8. 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

作成中