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

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

ただいまの
回答率

88.77%

UnityでGoogleMapsの表示をしたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,973

useyo

score 11

前提・実現したいこと

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")

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;

public class DrawGoogleMap : MonoBehaviour {
    public float lat = 35.6259034f;
    public float lng = 139.7268499f;
    public string key = null;
    public int zoom = 15;

    // Google Maps Embed API
    string Url = @"https://maps.googleapis.com/maps/api/staticmap?";

    // Use this for initialization
    void Start () {
        Build ();
    }

    // Update is called once per frame
    void Update () {

    }

    public void Build(){

        // 中心座標 
        Url += "center=" + lat + "," + lng;

        // ズームレベル
        Url += "&zoom=" + zoom;

        // 地図画像のサイズ
        Url += "&size=480x480";

        if (key != null && key.Length != 0) {
            Url += "&key=" + key;
        }

        Url = Uri.EscapeUriString(Url);
        StartCoroutine(Download(this.Url, tex => addSplatPrototype(tex)));
    }

    /// GoogleMapsAPIから地図画像をダウンロードする
    IEnumerator Download(string url, Action<Texture2D> callback) {
        var www = new WWW(url);
        yield return www; // Wait for download to complete

        callback(www.texture);
    }

    /// imageにテクスチャを貼り付ける
    public void addSplatPrototype(Texture2D tex) {
        GetComponent<Image> ().sprite = Sprite.Create(tex, new Rect(0,0,tex.width,tex.height), Vector2.zero);
    }
}

試したこと

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

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

Unityの開発環境: 2019.1.3f1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fiveHundred

    2019/05/30 16:53

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

    キャンセル

  • useyo

    2019/05/30 17:09

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

    キャンセル

回答 1

checkベストアンサー

+1

■ 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/31 06:52

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

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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