Unity 获取手机地理位置信息
创始人
2024-05-24 10:26:43
0

Unity 获取手机地理位置信息

引言

在游戏的开发过程中,有时候会遇到需要获取玩家位置信息的需求,比如显示玩家所在的国家城市等。

有一下方法可以参考:

  • 可以根据手机的地区和语言来做判断。

  • 根据IP来判断所处的位置,阿里云啥的都有对应的接口服务。

  • 根据GPS来判断。

以上方法都各有利弊吧,这里简单介绍下根据GPS来处理的方案。

实现

Unity中不提供直接获取玩家在哪个国家哪座城市的功能,只提供获取一些GPS信息的功能,这样我们就需要根据GPS信息来获取具体的国家城市,需要借助一些第三方插件来实现。

Unity获取用户的经纬度信息

官方文档:Unity - Scripting API: LocationService.Start (unity3d.com)

我根据官方文档做了一些修改,在请求权限的时候因为使用的Unity2019,Unity提供的接口还不支持回调返回,所以这里做了一些处理。

完整代码如下:

using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEngine;
using UnityEngine.Android;
using UnityEngine.Events;/// 
/// GPS位置管理器
/// 
public class LocationManager : MonoBehaviour
{#region 单例public static LocationManager _Instance;public static LocationManager Instance{get{if (_Instance == null){GameObject obj = new GameObject("LocationManager");_Instance = obj.AddComponent();DontDestroyOnLoad(obj);}return _Instance;}}#endregion/// /// 超时时间/// 20秒/// private const float Time_Out = 20;/// /// 启动成功回调/// public event UnityAction SuccessCallback;/// /// 失败回调/// public event UnityAction FailureCallback;/// /// 刷新回调/// public event UnityAction UpdateCallback;/// /// 停止回调/// public event UnityAction StoppedCallback;/// /// 是否开始/// private bool _IsStarted = false;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){if (Input.location.status == LocationServiceStatus.Running){OnUpdate(Input.location.lastData);}
#if UNITY_ANDROID && !UNITY_EDITORif (UnityEngine.Android.Permission.HasUserAuthorizedPermission(UnityEngine.Android.Permission.FineLocation)){StartGPS();}
#endif}/// /// 申请权限/// public static void RequestPermission(){
#if UNITY_ANDROID && !UNITY_EDITORstring permission = UnityEngine.Android.Permission.FineLocation;if (!UnityEngine.Android.Permission.HasUserAuthorizedPermission(permission)){UnityEngine.Android.Permission.RequestUserPermission(permission);}
#endif}/// /// 初始化/// public void Init(){RequestPermission();StartGPS();}/// /// 开始定位/// private void StartGPS(){if (!Input.location.isEnabledByUser){OnError("用户没有权限");return;}if (_IsStarted){return;}_IsStarted = true;Input.location.Start();StartCoroutine(GetGPS());}private IEnumerator GetGPS(){float time = Time_Out;while (Input.location.status == LocationServiceStatus.Initializing && time > 0){yield return new WaitForSeconds(1);time--;}if (time < 1){OnError("Timed out");yield break;}if (Input.location.status == LocationServiceStatus.Failed){OnError("Unable to determine device location");yield break;}else{OnStartSuccess(Input.location.lastData);}}/// /// 停止定位/// public static void StopGPS(){if (!_Instance){return;}if (!_Instance._IsStarted){return;}try{Input.location.Stop();_Instance._IsStarted = false;}catch (System.Exception){throw;}finally{_Instance.OnStopped();}}/// /// 启动成功/// /// private void OnStartSuccess(LocationInfo locationInfo){Debug.Log("OnStartSuccess:" + locationInfo.latitude + " " + locationInfo.longitude + " " + locationInfo.altitude + " " + locationInfo.horizontalAccuracy + " " + locationInfo.timestamp);SuccessCallback?.Invoke(locationInfo);}/// /// 发生错误/// private void OnError(string errorInfo){Debug.Log("OnError:" + errorInfo);FailureCallback?.Invoke(errorInfo);StopGPS();}/// /// 更新位置/// /// private void OnUpdate(LocationInfo locationInfo){UpdateCallback?.Invoke(locationInfo);}/// /// 停止/// private void OnStopped(){Debug.Log("OnStopped:");StoppedCallback?.Invoke();if (gameObject){Destroy(gameObject);_Instance = null;}}
}

根据GPS信息获取对应的国家城市

基本上所有的地图都有这个功能,例如百度地图,谷歌地图等。

百度地图:逆地理编码 rgc 反geo检索 | 百度地图API SDK (baidu.com)

谷歌地图:反向地理编码(地址查询)请求和响应 | Geocoding API | Google Developers

简答来说就是都是通过网络请求,将GPS信息和自己创建的密钥发送给后台,后台返回对应的国家城市信息,按照指定的格式进行解析就可以了,这里就不过多介绍了。

但是想用起来都不简单,毕竟人家统计这么多地图信息也不容易。

尾语

如果有写的不好的地方,欢迎各位大佬批评指正。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...