前提・実現したいこと
こちらのサイト(https://techblog.raccoon.ne.jp/archives/2019090403.html)のソースコードを用いて同じように作成していたところ、DirectionController というスクリプトのvar leg = googleDirectionData.routes[0].legs[0];の部分でエラーが出てきてしまい、経路表示が行われません。どのようにすればよいのでしょうか?
発生している問題・エラーメッセージ
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index System.ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument argument, System.ExceptionResource resource) (at <f2e6809acb14476a81f399aeb800f8f2>:0) System.ThrowHelper.ThrowArgumentOutOfRangeException () (at <f2e6809acb14476a81f399aeb800f8f2>:0) System.Collections.Generic.List`1[T].get_Item (System.Int32 index) (at <f2e6809acb14476a81f399aeb800f8f2>:0) DirectionController+<GetDirection>c__Iterator0.MoveNext () (at Assets/DirectionController.cs:62) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)
該当のソースコード
using System.Collections; using UnityEngine; using UnityEngine.Networking; using System.Runtime.Serialization.Json; using System.Text; using System.IO; using UnityEngine.UI; public class DirectionController : MonoBehaviour { private const string GOOGLE_DIRECTIONS_API_URL = "https://maps.googleapis.com/maps/api/directions/json?key=${APIKey}&mode=walking"; // 目的地を入力させるInputField public InputField destination; // APIより取得した経路(staticMapControllerに渡すためのパラメータ) public string destinationRoute = ""; private int frame = 0; // 初期状態では目的地が入ることはないのでStartでは何もしない。 void Start() { } void Update() { // 更新は5秒に一度、目的地が設定されていない場合は取得しない。 if (frame >= 300 && destination.text != "") { Debug.Log(UnityWebRequest.UnEscapeURL(destination.text)); StartCoroutine(GetDirection()); frame = 0; } frame++; } private IEnumerator GetDirection() { // origin=開始地点。現在地からの経路を出したいので現在地を渡す。 var query = "&origin=" + UnityWebRequest.UnEscapeURL(string.Format("{0},{1}", Input.location.lastData.latitude, Input.location.lastData.longitude)); // destination=目的地。InputFieldに入力した文字列をエスケープして渡す。 query += "&destination=" + UnityWebRequest.UnEscapeURL(destination.text); UnityWebRequest req = UnityWebRequest.Get(GOOGLE_DIRECTIONS_API_URL + query); yield return req.SendWebRequest(); if (req.error == null) { // 返ってきたjsonをByte[]形式を処理できるMemoryStreamで受け取る MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(req.downloadHandler.text)); // google DirectionのJSONをオブジェクトとして読み込めるようにシリアライザを作成 var serializer = new DataContractJsonSerializer(typeof(GoogleDirectionData)); // 作成したJSON用のクラスにデシリアライズ GoogleDirectionData googleDirectionData = (GoogleDirectionData)serializer.ReadObject(ms); // データの形式としてroutes[0].legs[0]は固定なので一旦変数に格納 var leg = googleDirectionData.routes[0].legs[0]; // 書き込み前に初期化 destinationRoute = ""; for (int i = 0; i < leg.steps.Count; i++) { // 経路は|緯度,経度|という書き方になるので、受け取ったlatitude, longitudeをパイプとカンマを付けて追加していく destinationRoute += "|" + leg.steps[i].end_location.lat + "," + leg.steps[i].end_location.lng; // 経路が多すぎるとUriFormatExceptionで落ちるため上限を設定しておく。 if (i > 20) break; } } } }
試したこと
いろいろと調べてみたのですがわかりませんでした。
補足情報(FW/ツールのバージョンなど)
ver : Unity 2018.2.21f1
APIキーなどはちゃんと自分で取得しており、この段階までの地図表示や経緯度取得などはできています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。