現在的手機都是智能手機,都帶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);
}
}
}
上圖中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以上的版本進行打包。