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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

1回答

1747閲覧

UnityでGoogleMapsの表示をしたい。

useyo

総合スコア11

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

0クリップ

投稿2019/05/30 07:45

編集2019/05/30 08:08

前提・実現したいこと

UnityでGoogleMapsの表示をしたいです。

参考にしたURLは以下の通りです。
https://tech.mobilefactory.jp/entry/2018/12/18/110000

これを参考に行いましたが,「地図を取得し貼り付ける実装」のところでエラーが発生しました。
unityで,wwwのクラスが使えなくなったそうです。との意のエラー文でした。

Unityの新しいバージョンで,GoogleMapsの表示をする方法を教えて下さい。

発生している問題・エラーメッセージ

'WWW'は旧形式です("Use UnityWebRequest,a fully featured replacement which is more efficient and has additional features")

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5using UnityEngine.UI; 6 7public class DrawGoogleMap : MonoBehaviour { 8 public float lat = 35.6259034f; 9 public float lng = 139.7268499f; 10 public string key = null; 11 public int zoom = 15; 12 13 // Google Maps Embed API 14 string Url = @"https://maps.googleapis.com/maps/api/staticmap?"; 15 16 // Use this for initialization 17 void Start () { 18 Build (); 19 } 20 21 // Update is called once per frame 22 void Update () { 23 24 } 25 26 public void Build(){ 27 28 // 中心座標 29 Url += "center=" + lat + "," + lng; 30 31 // ズームレベル 32 Url += "&zoom=" + zoom; 33 34 // 地図画像のサイズ 35 Url += "&size=480x480"; 36 37 if (key != null && key.Length != 0) { 38 Url += "&key=" + key; 39 } 40 41 Url = Uri.EscapeUriString(Url); 42 StartCoroutine(Download(this.Url, tex => addSplatPrototype(tex))); 43 } 44 45 /// GoogleMapsAPIから地図画像をダウンロードする 46 IEnumerator Download(string url, Action<Texture2D> callback) { 47 var www = new WWW(url); 48 yield return www; // Wait for download to complete 49 50 callback(www.texture); 51 } 52 53 /// imageにテクスチャを貼り付ける 54 public void addSplatPrototype(Texture2D tex) { 55 GetComponent<Image> ().sprite = Sprite.Create(tex, new Rect(0,0,tex.width,tex.height), Vector2.zero); 56 } 57}

試したこと

UnityWebRequestを使うことで,wwwのクラスの代替になることがわかりましたが,Mapの表示をすることができませんでした。
Unityの新しいバージョンで,GoogleMapsの表示をする方法やwwwクラスを用いらないソースコードについて教えて下さい。

補足情報(FW/ツールのバージョンなど)

Unityの開発環境: 2019.1.3f1

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2019/05/30 07:53

「希望する動作を行うことができませんでした。」と書かれていても、「希望する動作は何なのか」「どこが上手くいっていないのか」「希望する動作をするためにどうすればいいのか」が分かりません。 質問は編集できるので、もう少し具体的に記載してください。 途中でもいいので、コードを記載するのもよいと思います。
useyo

2019/05/30 08:09

ご意見ありがとうございます。 内容が伝わりにくかったため、修正いたしました。 よろしくお願いします。
guest

回答1

0

ベストアンサー

■ WWWは非推奨になりましたが、エディタ上ならばまだ動くはずです。
なのでこれが直接の原因ではないかと思います。

■ ビルドされたURLをログなどで出力してブラウザでアクセスできることを確かめましたか?
掲載されたスクリプトのKeyが空なのはセキュリティを意識してインスペクタで設定することにしているのならよいのですが、
インスペクタでも設定されていない場合、まずはグーグルマップアカウントに登録する必要があるので下記のURLもしくは「Google Maps Platform」で検索してAPIキーを取得してください。
http://g.co/dev/maps-no-account

(ちなみにメンバ変数を書き換えてビルドしていますが大丈夫でしょうか。 Buildを2回実行したらURLが壊れて正常に通信できないという認識はありますでしょうか。)

■ エラーのキャッチとハンドリングは小さなプログラムでも書くようにしましょう。
焦って先に進んでまぐれでうまくいっても、すぐにどうやっても動かない壊れたコードになります。

掲載頂いたコードを元にサンプルを書いたので、コードの内容や出力されたエラーメッセージに対するご質問があればコメントをお願いします。

(オブジェクト指向や、ビュー・モデル・プレゼンター・コントローラーをなどを分離するアーキテクチャなどに知見がなければ、通勤通学中などにスマホでググって勉強することをおすすめします。)

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; // Networking名前空間を参照 using UnityEngine.UI; /// <summary> /// グーグルスタティックマップ画像描画アシストコンポーネント /// </summary> [RequireComponent(typeof(Image))] // Imageコンポーネントが必ずアタッチされるように public class GoogleStaticMapDrawAssistant : MonoBehaviour { // インスペクタから編集可能な地図画像ダウンロードリクエスト [SerializeField] GoogleMapSpriteDownloadRequest request = default; // 初期化時にリクエストを送信するか [SerializeField] bool requestOnAwake = true; /// <summary> /// 地図画像ダウンロードリクエストを取得します。 /// </summary> public GoogleMapSpriteDownloadRequest Request => request; // コンポーネントを初期化します。 void Awake() { // 自身のスプライト描画コンポーネントをキャッシュする var myImage = GetComponent<Image>(); // リクエストの送受信が完了したら受け取ったスプライトを自身のスプライト描画コンポーネントに設定する request.OnSpriteDownloaded += sprite => { myImage.sprite = sprite; }; // リクエストでエラーが発生したらログに表示する request.OnError += error => { Debug.LogWarning($"グーグルマップからのテクスチャ取得中にエラーが発生しました。 : {error.Message}"); }; // 初期化時にリクエストを送る if (requestOnAwake) { StartCoroutine(request.SendRoutine()); } } } /// <summary> /// グーグルマップ画像ダウンロードリクエスト /// </summary> [Serializable] public class GoogleMapSpriteDownloadRequest { // ベースURL const string GoogleStaticMapURL = "https://maps.googleapis.com/maps/api/staticmap"; // 座標パラメーター [SerializeField] public float lat = default; [SerializeField] public float lng = default; [SerializeField] public string key = default; [SerializeField] public int zoom = default; [SerializeField] public int width = default; [SerializeField] public int height = default; /// <summary> /// 地図スプライトがダウンロードされた際に通知されます。 /// </summary> public event Action<Sprite> OnSpriteDownloaded; /// <summary> /// リクエストでエラーが発生した際に通知されます。 /// </summary> public event Action<Exception> OnError; /// <summary> /// 地図画像ダウンロードのリクエストを送信します。 /// </summary> public IEnumerator SendRoutine(Action<Exception> doOnError = null) { // UnityWebRequestTextureでテクスチャを要求する var request = UnityWebRequestTexture.GetTexture(BuildUrl()); // 通信を待機する yield return request.SendWebRequest(); try { // 通信エラーを判定する if (request.isNetworkError) { throw new Exception($"ネットワークへの通信に失敗しました。 : {request.error}"); } if (request.isHttpError) { throw new Exception($"APIの呼び出しに失敗しました。{request.error}"); } // downloadHandlerをDownloadHandlerTextureにキャストしてテクスチャを取得する var texture = (request.downloadHandler as DownloadHandlerTexture).texture; var sprite = Texture2DToSprite(texture); // 取得したスプライトはイベントで通知する OnSpriteDownloaded?.Invoke(sprite); } catch (Exception error) { // エラーが発生した際は引数のイベントとメンバのイベントに通知する doOnError?.Invoke(error); OnError?.Invoke(error); } } // URLをビルドします。 string BuildUrl() { var url = Uri.EscapeUriString($"{GoogleStaticMapURL}?{BuildParameters()}"); Debug.Log($"ビルドされたURL : {url}"); // ログに出力されたURLをブラウザにコピー&ペーストしてマップが表示されるか確認してください。 return url; } // URLのパラメーターをビルドします。 string BuildParameters() { var parameters = new List<string>(); // 中心座標 parameters.Add($"center={lat},{lng}"); // ズームレベル parameters.Add($"zoom={zoom}"); // 地図画像のサイズ parameters.Add($"size={width}x{height}"); // APIキー if (!string.IsNullOrEmpty(key)) { parameters.Add($"key={key}"); } return string.Join("&", parameters.ToArray()); } // テクスチャからスプライトを生成します。 Sprite Texture2DToSprite(Texture2D tex) { return Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero); } }

投稿2019/05/30 16:03

umanome

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

useyo

2019/05/30 21:52

ご回答ありがとうございました。UnityにGoogleMapを表示させることができました。 エラーのキャッチなど,コードの書き方についてもアドバイスを頂いたので,是非参考にさせていただきます。基本的なことから勉強不足だと感じたので,努力して学びます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問