2017-01-21 2 views
1

Я использовал систему GPS Unity и заметил, что она никогда не обновлялась. Мне пришлось закрыть приложение и запустить его снова, чтобы получить текущую позицию.Автоматическое обновление местоположения GPS

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

public class TestLocationService : MonoBehaviour { 
    public GameObject longText; 
    public GameObject latText; 

    IEnumerator Start() { 
     Text longitudeText = longText.GetComponent<Text>(); 
     Text latitudeText = latText.GetComponent<Text>(); 

     if (!Input.location.isEnabledByUser) 
      yield break; 

     Input.location.Start(); 

     int maxWait = 20; 
     while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0) { 
      yield return new WaitForSeconds(1); 
      maxWait--; 
     } 

     if (maxWait < 1) { 
      print("Timed out"); 
      yield break; 
     } 


     if (Input.location.status == LocationServiceStatus.Failed) { 
      print("Unable to determine device location"); 
      yield break; 
     } else { 
      print("Location: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude + " " + Input.location.lastData.altitude + " " + Input.location.lastData.horizontalAccuracy + " " + Input.location.lastData.timestamp); 
      longitudeText.text = "Longitude: " + Input.location.lastData.longitude; 
      latitudeText.text = "Latitude: " + Input.location.lastData.latitude; 
     } 

     Input.location.Stop(); 
    } 
} 

Я бы поблагодарил бы за помощь в создании этого автообновления в моем текущем местоположении! Заранее спасибо!

+0

Ожидали ли вы его обновить? Что вы пробовали? – Jecoms

ответ

1

Код, который у вас есть, покажет местоположение GPS, затем Input.location.Stop(); вызывается для остановки GPS.

Помещенного

print("Location: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude + " " + Input.location.lastData.altitude + " " + Input.location.lastData.horizontalAccuracy + " " + Input.location.lastData.timestamp); 
longitudeText.text = "Longitude: " + Input.location.lastData.longitude; 
latitudeText.text = "Latitude: " + Input.location.lastData.latitude; 

в while петли затем добавить yield return new WaitForSeconds(1); внутри цикла while подождать некоторое время. Другой способ сделать это - запустить другую сопрограмму, которая будет обновлять местоположение GPS с течением времени.

Что-то вроде этого:

public class TestLocationService : MonoBehaviour 
{ 

    public GameObject longText; 
    public GameObject latText; 

    IEnumerator coroutine; 

    IEnumerator Start() 
    { 
     coroutine = updateGPS(); 

     Text longitudeText = longText.GetComponent<Text>(); 
     Text latitudeText = latText.GetComponent<Text>(); 

     if (!Input.location.isEnabledByUser) 
      yield break; 

     Input.location.Start(); 

     int maxWait = 20; 
     while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0) 
     { 
      yield return new WaitForSeconds(1); 
      maxWait--; 
     } 

     if (maxWait < 1) 
     { 
      print("Timed out"); 
      yield break; 
     } 


     if (Input.location.status == LocationServiceStatus.Failed) 
     { 
      print("Unable to determine device location"); 
      yield break; 
     } 
     else 
     { 
      print("Location: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude + " " + Input.location.lastData.altitude + " " + Input.location.lastData.horizontalAccuracy + " " + Input.location.lastData.timestamp); 
      longitudeText.text = "Longitude: " + Input.location.lastData.longitude; 
      latitudeText.text = "Latitude: " + Input.location.lastData.latitude; 
      StartCoroutine(coroutine); 
     } 
    } 

    IEnumerator updateGPS() 
    { 
     float UPDATE_TIME = 3f; //Every 3 seconds 
     WaitForSeconds updateTime = new WaitForSeconds(UPDATE_TIME); 

     while (true) 
     { 
      print("Location: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude + " " + Input.location.lastData.altitude + " " + Input.location.lastData.horizontalAccuracy + " " + Input.location.lastData.timestamp); 
      //longitudeText.text = "Longitude: " + Input.location.lastData.longitude; 
      //latitudeText.text = "Latitude: " + Input.location.lastData.latitude; 
      yield return updateTime; 
     } 
    } 

    void stopGPS() 
    { 
     Input.location.Stop(); 
     StopCoroutine(coroutine); 
    } 

    void OnDisable() 
    { 
     stopGPS(); 
    } 
} 
+0

По какой-то причине приложение потерпело крах после первого его открытия, затем мне пришлось его снова открыть, после чего он разбился примерно через 20 секунд. Каждый раз, когда я открываю его после этого, он также падает через 20 секунд, пока я полностью не уйду из него, затем он немедленно сработает. Однако он показывает мои данные о местоположении. Кстати, я нахожусь на Android Lollipop. –

+0

Я не вижу ничего, что могло бы привести к сбою там приложения. Какова ваша версия Unity? Не могли бы вы попробовать попробовать это на другом устройстве Android и посмотреть, сохраняется ли авария? – Programmer

+0

Я использую Unity 5.5.0f3, я попробовал его на другом устройстве Android, и произошло то же самое. –

Смежные вопросы