在Unity中实现GPS定位(获取用户地理位置,不使用第三方插件)
2017-08-21 10:03
846 查看
现在的手机都是智能手机,都带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外, 其余
b95c
全为 float 型。
这是两个官方的东西,下面用一个例子来使用一下这个方法,首先新建工程,建立脚本测试:
1.新建一个GetGPS的脚本
2.场景中新建一个button,用来刷新位置
3.场景中新建一个Text用来展示位置数据
然后导出到手机,运行查看成果,安卓手机可直接导出,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以上的版本,部分机型依然会闪退,这就牵扯到你应用上架的问题了,现在有些手机厂商为了保护用户手机,不允许安装第三方应用进去,只能从各大应用市场进行下载,此时你需要让手机安装未知来源的应用,并允许此应用获取位置,这样就可以达到防闪退的目的
一、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外, 其余
b95c
全为 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以上的版本,部分机型依然会闪退,这就牵扯到你应用上架的问题了,现在有些手机厂商为了保护用户手机,不允许安装第三方应用进去,只能从各大应用市场进行下载,此时你需要让手机安装未知来源的应用,并允许此应用获取位置,这样就可以达到防闪退的目的
相关文章推荐
- Android使用GPS获取用户地理位置并监听位置变化的方法
- 借助第三方插件(有道)通过ip获取用户所在的地理位置
- HTML5 - 使用Geolocation(地理定位)获取用户的位置
- 借助第三方插件(有道)通过ip获取用户所在的地理位置
- android 通过GPS获取用户地理位置并监听位置变化
- android 通过GPS获取用户地理位置并监听位置变化
- HTML5实现获取地理位置信息并定位功能
- android 通过GPS获取用户地理位置并监听位置变化
- 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
- android 通过GPS获取用户地理位置并监听位置变化
- AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)
- 使用navigator.geolocation来获取用户的地理位置信息
- Android基于mAppWidget实现手绘地图(八)–获取用户地理位置
- AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)
- 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)
- Android 使用GPS获取当前地理位置
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)