【TECH BLOG #58】GPS機能を実装してみた

グリーエンターテインメント株式会社のUnityエンジニアATです。
今回は某タイトルで使用したGPS機能を実装した際につまづいた点や気を付けた点についてお話したいと思います。
はじめに
Unityを使ってiOS/Android向けの開発を行っています。
今回のGPS機能の要件は位置情報を取得し、設定した範囲内かどうか判定するというものです。
GPS実装
Unityでは位置情報を取得するために「LocationService」というインターフェースが用意されており、位置情報の取得自体は簡単にできます。
実装時はiOSとAndroidで位置情報取得の許可状態が異なっているため、それぞれに適した処理を行い実機で確認しながら開発を進める必要があります。
(ソースコードはたくさんの記事で取り上げられているので割愛します。)
実装中のポイント
いくつか実装中に工夫したポイントや苦戦したポイントがあるのでお話したいと思います。
●実機確認
位置情報の取得には各OS実機を使う必要があるのですが、Unityで提供されている「Unity Remote5」を使うことでビルドをせずに確認を行うことができました。
最終的にはビルドして確認を行いますが開発中は非常に時間短縮になりました。
●iOSのビルドエラー
ビルドしてみると「Location Usage Description」の設定が足りないというエラーが発生しました。「ProjectSettings > Player > OtherSettings」 に「Location Usage Description」があるので、実機の位置情報許可ポップアップに表示される文言の設定を追加することでエラーを解消させることができました。

このようにソースコード以外の対応も漏れがないように注意が必要です。
●GPS機能のデバッグ
指定範囲の場所にいって確認することが難しいので、デバッグ機能を作成しました。
-アプリ内で任意の緯度と経度を入力し、現在位置の偽装を可能にしました。これにより偽装した位置でGPS機能の範囲判定の確認ができます。
今回の要件に限らず実際に移動して確認をするのは大変なので、位置情報を用いた機能の際はデバッグ機能は必要になりそうです。
偽装対策
世の中には多くの位置偽装の手段が存在し、誰でも簡単に位置偽装ができてしまいます。
プロジェクトとして位置偽装は許容しかねますが、無数に手段があるためどこまで対応するべきか検討する必要がありました。
パッと想像するだけでもこんなものがあるのかなと思います。
1.位置偽装アプリでの位置偽装
2.エミュレーターでの位置偽装
3.Root化による位置偽装
などなど
今回のタイトルではセキュリティ対策ソフトを導入しておりRoot化は防いでいます。
さらに最も簡単な位置偽装アプリの対策を行うべきとし、同セキュリティ対策ソフトを用いることにしました。動作させたくないアプリを指定することで、端末に指定したアプリが存在しているとアプリケーションを起動させないという仕組みを利用しています。
※指定したアプリの選定基準は「位置偽装/GPS」などのワードで検索し表示されるアプリのうち「位置偽装機能」を持つものとしています。
範囲問題
範囲内かどうかの判定にはUnity側で取得した位置情報をサーバーへ送り、マスタで範囲を設定しサーバー側で位置を判定する手段をとりました。
[参考] マスタの範囲設定イメージ(起点座標から取得範囲0.001)

起点座標からの取得範囲の中に位置座標が収まっているかを2点間の距離の公式「 sqrt( (x1-x2)^2 + (y1-y2)^2 )」で計算しています。
(今回は座標を平面とみなして計算していますが、度数で計算すると赤道から離れるほど東西方向の距離が短くなるので厳密には計算の調整が必要になるかもしれません。)
運用を進めていたところ一つ問題が発生しました。
広い敷地で位置情報を判定した時に敷地の端が範囲内に入らない場合があるのです。
この時はマスタ側の範囲を広げることで対応ができましたが、広い敷地の場合は設定値に気をつけて範囲を広めにとっておくことが大事です。
まとめ
GPSを用いる場合、Unityで位置情報の取得は簡単にできますが、実装以外の今回取り上げたポイントはエンジニアとしてサポートできることが望ましいです。
またGPSの実装についてお話しましたが、実装を通してUnityRemote5やセキュリティソフトなど開発全てに通じる学びが多かったなと個人的に思いました。
最後まで読んでいただきありがとうございました。
みなさまの知見の一部になれば幸いです。
本件に関するお問い合わせ先
グリーエンターテインメント株式会社 広報担当
東京都港区六本木6-11-1 六本木ヒルズゲートタワー
E-mail:info-ent@ml.gree.net