在Unity中實現GPS定位(獲取用戶地理位置,不使用第三方插件)

  現在的手機都是智能手機,都帶GPS定位功能,GPS也給我們帶來了很多便利,由於項目需要,我們的項目中也接入了GPS定位功能,於是我開始瞭解GPS的接入,原本以爲要接入第三方插件進去,結果看了看有原生的方法,在unity的官方文檔中,與定位相關的API,目前只找到了兩個LocationService 和 LocationInfo 這兩個方法每個方法都不太一樣

一、LocationService  

官方文檔地址https://docs.unity3d.com/ScriptReference/LocationService.html



上面變量的解釋

1.isenabledbyuser 用戶是否開啓了定位服務(好像沒什麼用,一直是true)

2.lastdata 最後一次獲取到的位置信息

3.status 定位的服務狀態

4.start 啓動定位服務

5.stop 停止定位服務


二、LocationInfo 

屬性如下:

(1) altitude -- 海拔高度 

(2) horizontalAccuracy -- 水平精度 

(3) latitude -- 緯度 

(4) longitude -- 經度 

(5) timestamp -- 最近一次定位的時間戳,從1970開始 

(6) verticalAccuracy -- 垂直精度 


這些屬性,除了timestamp爲double外, 其餘全爲 float 型。



這是兩個官方的東西,下面用一個例子來使用一下這個方法,首先新建工程,建立腳本測試:

1.新建一個GetGPS的腳本

2.場景中新建一個button,用來刷新位置

3.場景中新建一個Text用來展示位置數據

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

public class GetGPS : MonoBehaviour {
    string GetGps = "";
    public Text ShowGPS;
    /// <summary>
    /// 初始化一次位置
    /// </summary>
    void Start()
    {
        StartCoroutine(StartGPS());
        GetGps = "N:" +  Input.location.lastData.latitude + " E:" + Input.location.lastData.longitude;
        GetGps = GetGps + " Time:" + Input.location.lastData.timestamp;
        ShowGPS.text = GetGps;
        Debug.Log(GetGps);  
    }
    /// <summary>
    /// 刷新位置信息(按鈕的點擊事件)
    /// </summary>
    public void updateGps()
    {
        StartCoroutine(StartGPS());
        GetGps = "N:" + Input.location.lastData.latitude + " E:" + Input.location.lastData.longitude;
        GetGps = GetGps + " Time:" + Input.location.lastData.timestamp;
        ShowGPS.text = GetGps;
        Debug.Log(GetGps);
    }
  /// <summary>
  /// 停止刷新位置(節省手機電量)
  /// </summary>
    void StopGPS()
    {
        Input.location.Stop();
    }

    IEnumerator StartGPS()
    {
        // Input.location 用於訪問設備的位置屬性(手持設備), 靜態的LocationService位置  
        // LocationService.isEnabledByUser 用戶設置裏的定位服務是否啓用  
        if (!Input.location.isEnabledByUser)
        {
            GetGps = "isEnabledByUser value is:" + Input.location.isEnabledByUser.ToString() + " Please turn on the GPS";
            yield return false;
        }

        // LocationService.Start() 啓動位置服務的更新,最後一個位置座標會被使用  
        Input.location.Start(10.0f, 10.0f);

        int maxWait = 20;
        while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)
        {
            // 暫停協同程序的執行(1秒)  
            yield return new WaitForSeconds(1);
            maxWait--;
        }

        if (maxWait < 1)
        {
            GetGps = "Init GPS service time out";
            yield return false;
        }

        if (Input.location.status == LocationServiceStatus.Failed)
        {
            GetGps = "Unable to determine device location";
            yield return false;
        }
        else
        {
            GetGps = "N:" + Input.location.lastData.latitude + " E:" + Input.location.lastData.longitude;
            GetGps = GetGps + " Time:" + Input.location.lastData.timestamp;
            yield return new WaitForSeconds(100);
        }
    }
}



然後導出到手機,運行查看成果,安卓手機可直接導出,iOS打包時需要注意權限的配置,不配置權限獲取不到位置信息

上圖中123標記的位置

1.點擊info添加權限

2.添加Privacy - Location When In Use Usage Description

3.對Privacy - Location When In Use Usage Description進行解釋,此處隨便寫


最近修改:

問題追蹤

1.Android手機閃退

解決方案:

(1)由於unity5.6以下的版本對LocationSever處理的缺陷,導致部分安卓機型會出現閃退的問題,所以建議大家最好使用5.6以上的版本進行打包。

(2)儘管使用了5.6以上的版本,部分機型依然會閃退,這就牽扯到你應用上架的問題了,現在有些手機廠商爲了保護用戶手機,不允許安裝第三方應用進去,只能從各大應用市場進行下載,此時你需要讓手機安裝未知來源的應用,並允許此應用獲取位置,這樣就可以達到防閃退的目的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章