質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

[Unity] GoogleMapをUnity上で表示する方法

amber_snob
amber_snob

総合スコア0

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

2回答

0評価

0クリップ

61閲覧

投稿2019/08/05 14:34

編集2022/01/12 10:58

現在オライリー・ジャパンの書籍"UnityによるARゲーム開発"を参考にしてゲーム開発しています。

画像1
上の画面では、Planeを配置してアッタチしたGoogleMapTilesからgoogleマップを表示させようとしているのですがうまくいきません。

画像2
(正常に動作すればこのようにPlaneにgoogleマップが表示されます。)

画像3
一つ目はgoogleマップへの画像リクエストのクエリの表示で、

Tile 0x0 requested with

center=37.62815,-122.4265 // リクエストする地図の中心の座標の緯度と経度
&zoom=15 // 地図のズームレベル
&size=640x640 // リクエストされた画像の画素サイズ
&scale=2
&maptype=roadmap // 地図の種類(この場合は道など)
&format=png // 取得する画像の形式
&style=element:geometry|invert_lightness:true|weight:3.1|hue:0x00ffd5
&style=element:labels|visibility:off&sensor=false

二つはエラーになります。
表示する画像にエラーがあった時に表示される文章のようです。

Error loading tile 0x0: exception=HTTP/1.1 403 Forbidden

UnityEngine.MonoBehaviour:print(Object)
packt.FoodyGO.Mapping.<_RefreshMapTile>d__16:MoveNext() (at Assets/FoodyGo/Scripts/Mapping/GoogleMapTile.cs:123)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

"HTTP/1.1 403 Forbidden"はクライアントエラーレスポンスコードで、サーバーがリクエストを理解したものの、認証が拒否されたことを示しているようなので、APIの取得に失敗している可能性があります。

また、他の座標を示しても結果は変わりませんでした。

詳しい方がいらっしゃいましたら、エラーの解決法を教えていただきたいです。

ソースコード(PlaneにアタッチしているGoogleMapTlle.csなど)は以下のリンクから手に入ります。
Chapter2.unitypackage

C#

using UnityEngine; using UnityEngine.Networking; using System.Collections; using packt.FoodyGo.Mapping; using packt.FoodyGo.Services; namespace packt.FoodyGO.Mapping { [AddComponentMenu("Mapping/GoogleMapTile")] public class GoogleMapTile : MonoBehaviour { public enum MapType { RoadMap, Satellite, Terrain, Hybrid } //Google Maps API Staticmap URL private const string GOOGLE_MAPS_URL = "https://maps.googleapis.com/maps/api/staticmap"; [Header("Map Settings")] [Range(1,20)] [Tooltip("Zoom Level, 1=global - 20=house")] public int zoomLevel = 1; [Tooltip("Type of map, Road, Satellite, Terrain or Hybrid")] public MapType mapType = MapType.RoadMap; [Range(64,1024)] [Tooltip("Size in pixels of the map image")] public int size = 640; [Tooltip("Double the pixel resolution of the image returned")] public bool doubleResolution = true; public MapLocation worldCenterLocation; [Header("Tile Settings")] [Tooltip("Sets the tiles position in tile units")] public Vector2 TileOffset; [Tooltip("Calculated tile center")] public MapLocation tileCenterLocation; [Tooltip("Calculated tile corners")] public Vector2 TopLeftCorner; public Vector2 BottomRightCorner; [Header("GPS Settings")] [Tooltip("GPS service used to locate world center")] public GPSLocationService gpsLocationService; private double lastGPSUpdate; // Use this for initialization void Start () { RefreshMapTile (); } // Update is called once per frame void Update () { // 新しい位置が取得されたかどうかを確認する if (gpsLocationService != null && gpsLocationService.IsServiceStarted && lastGPSUpdate < gpsLocationService.Timestamp) { lastGPSUpdate = gpsLocationService.Timestamp; worldCenterLocation.Latitude = gpsLocationService.Latitude; worldCenterLocation.Longitude = gpsLocationService.Longitude; print("GoogleMapTile refreshing map texture"); RefreshMapTile(); } } public void RefreshMapTile() { StartCoroutine(_RefreshMapTile()); } IEnumerator _RefreshMapTile () { // タイル中心の緯度/経度を取得 tileCenterLocation.Latitude = GoogleMapUtils.adjustLatByPixels(worldCenterLocation.Latitude, (int)(size * 1 * TileOffset.y), zoomLevel); tileCenterLocation.Longitude = GoogleMapUtils.adjustLonByPixels(worldCenterLocation.Longitude, (int)(size * 1 * TileOffset.x), zoomLevel); var url = GOOGLE_MAPS_URL; var queryString = ""; // 地図タイルをリクエストするクエリ文字列パラメーターを作成する queryString += "center=" + WWW.UnEscapeURL (string.Format ("{0},{1}", tileCenterLocation.Latitude, tileCenterLocation.Longitude)); queryString += "&zoom=" + zoomLevel.ToString (); queryString += "&size=" + WWW.UnEscapeURL (string.Format ("{0}x{0}", size)); queryString += "&scale=" + (doubleResolution ? "2" : "1"); queryString += "&maptype=" + mapType.ToString ().ToLower (); queryString += "&format=" + "png"; // 地図のスタイルを追加する queryString += "&style=element:geometry|invert_lightness:true|weight:3.1|hue:0x00ffd5"; queryString += "&style=element:labels|visibility:off"; var usingSensor = false; #if MOBILE_INPUT usingSensor = Input.location.isEnabledByUser && Input.location.status == LocationServiceStatus.Running; #endif queryString += "&sensor=" + (usingSensor ? "true" : "false"); //set map bounds rect TopLeftCorner.x = GoogleMapUtils.adjustLonByPixels(tileCenterLocation.Longitude, -size, zoomLevel); TopLeftCorner.y = GoogleMapUtils.adjustLatByPixels(tileCenterLocation.Latitude, size, zoomLevel); BottomRightCorner.x = GoogleMapUtils.adjustLonByPixels(tileCenterLocation.Longitude, size, zoomLevel); BottomRightCorner.y = GoogleMapUtils.adjustLatByPixels(tileCenterLocation.Latitude, -size, zoomLevel); print(string.Format("Tile {0}x{1} requested with {2}", TileOffset.x, TileOffset.y, queryString)); // 最後に、画像をリクエストする var req = UnityWebRequestTexture.GetTexture(GOOGLE_MAPS_URL + "?" + queryString); //obsolute // サービスが応答するまで待つ yield return req.Send(); // 最初に古いテクスチャーを破棄する Destroy(GetComponent<Renderer>().material.mainTexture); // エラーをチェックする if (req.error != null) { print (string.Format ("Error loading tile {0}x{1}: exception={2}", TileOffset.x, TileOffset.y, req.error)); } else { // レンダリング画像がエラーがなければ戻ってきた画像をタイルテクスチャーとして設定する GetComponent<Renderer> ().material.mainTexture = ((DownloadHandlerTexture)req.downloadHandler).texture; print (string.Format ("Tile {0}x{1} textured", TileOffset.x, TileOffset.y)); } } } }

<追記1>
「UnityによるARゲーム開発 」(O’Reillyの書籍 日本語訳バージョン)
上記のサイトを拝見したのですが、課金しないとGoogleMapのAPIは使えないのでしょうか...?

<追記2>
イメージ説明
API取得画面はこんな感じです。

<追記3>
イメージ説明
MapsStaticAPIを有効にしてAPIキーをクエリに追加することでWeb上で画像を表示できました。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。