Unity 获取手机地理位置信息

news/2024/11/24 0:04:31/

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;/// <summary>
/// GPS位置管理器
/// </summary>
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<LocationManager>();DontDestroyOnLoad(obj);}return _Instance;}}#endregion/// <summary>/// 超时时间/// 20秒/// </summary>private const float Time_Out = 20;/// <summary>/// 启动成功回调/// </summary>public event UnityAction<LocationInfo> SuccessCallback;/// <summary>/// 失败回调/// </summary>public event UnityAction<string> FailureCallback;/// <summary>/// 刷新回调/// </summary>public event UnityAction<LocationInfo> UpdateCallback;/// <summary>/// 停止回调/// </summary>public event UnityAction StoppedCallback;/// <summary>/// 是否开始/// </summary>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}/// <summary>/// 申请权限/// </summary>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}/// <summary>/// 初始化/// </summary>public void Init(){RequestPermission();StartGPS();}/// <summary>/// 开始定位/// </summary>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);}}/// <summary>/// 停止定位/// </summary>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();}}/// <summary>/// 启动成功/// </summary>/// <param name="locationInfo"></param>private void OnStartSuccess(LocationInfo locationInfo){Debug.Log("OnStartSuccess:" + locationInfo.latitude + " " + locationInfo.longitude + " " + locationInfo.altitude + " " + locationInfo.horizontalAccuracy + " " + locationInfo.timestamp);SuccessCallback?.Invoke(locationInfo);}/// <summary>/// 发生错误/// </summary>private void OnError(string errorInfo){Debug.Log("OnError:" + errorInfo);FailureCallback?.Invoke(errorInfo);StopGPS();}/// <summary>/// 更新位置/// </summary>/// <param name="locationInfo"></param>private void OnUpdate(LocationInfo locationInfo){UpdateCallback?.Invoke(locationInfo);}/// <summary>/// 停止/// </summary>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信息和自己创建的密钥发送给后台,后台返回对应的国家城市信息,按照指定的格式进行解析就可以了,这里就不过多介绍了。

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

尾语

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


http://www.ppmy.cn/news/23638.html

相关文章

类和对象(下)

类和对象&#xff08;下&#xff09;再谈构造函数构造函数体赋值初始化列表explicit关键字static成员静态成员的特性友元友元函数友元类成员函数做友元内部类匿名对象编译器的一些优化再谈构造函数 构造函数体赋值 在创建对象的时候编译器会调用构造函数给对象中的成员变量一…

云原生安全2.X 进化论系列|揭秘云原生安全2.X的五大特征

随着云计算技术的蓬勃发展&#xff0c;传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。能够有效解决这些“痛点”的云原生技术正蓬勃发展&#xff0c;成为赋能业务创新的重要推动力&#xff0c;并已经应用到企业核心业务。然而&#xff0c;云原生技…

《唐诗三百首》数据源网络下载

2023年的 元宵之夜&#xff0c;这场以“长安”为主题的音乐会火了&#xff01;在抖音&#xff0c;超过2300万人次观看了直播&#xff0c;在线同赏唐诗与交响乐的融合。许多网友惊呼&#xff0c;上学时那些害怕背诵的诗句&#xff0c;原来还可以有这么美的表达这场近80分钟的音乐…

谈谈Spring中Bean的生命周期?(让你瞬间通透~)

目录 1.Bean的生命周期 1.1、概括 1.2、图解 2、代码示例 2.1、初始化代码 2.2、初始化的前置方法和后置方法&#xff08;重写&#xff09; 2.3、Spring启动类 2.4、执行结果 2.5、经典面试问题 3.总结 1.Bean的生命周期 1.1、概括 Spring中Bean的生命周期就是Bean在…

Negative Prompt in Stable Diffusion

必读链接&#xff1a;https://www.reddit.com/r/StableDiffusion/comments/z7salo/with_the_right_prompt_stable_diffusion_20_can_do/ A lot of people have noticed that Negative Prompt works wonders in 2.0, and works even better in 2.1. Negative hints are the op…

怡合达业务大规模容器化最佳实践

作者&#xff1a;肖念康&#xff0c;东莞怡合达智能制造供应链资深 Java 开发工程师&#xff0c;主要负责公司内部 DevOps、代码托管平台、任务需求管理平台的研发及其他项目的管理&#xff0c;云原生的研究与开发工作。 公司简介 怡合达致力于自动化零部件研发、生产和销售&am…

【笔记】移动端自动化:adb调试工具+appium+UIAutomatorViewer

学习源&#xff1a; https://www.bilibili.com/video/BV11p4y197HQ https://blog.csdn.net/weixin_47498728/category_11818905.html 一、移动端测试环境搭建 学习目标 1.能够搭建java 环境 2.能够搭建android 环境 &#xff08;一&#xff09;整体思路 我们的目标是Andr…

雪花算法snowflake

snowflake中文的意思是 雪花&#xff0c;雪片&#xff0c;所以翻译成雪花算法。它最早是twitter内部使用的分布式环境下的唯一ID生成算法。在2014年开源。雪花算法产生的背景当然是twitter高并发环境下对唯一ID生成的需求&#xff0c;得益于twitter内部高超的技术&#xff0c;雪…