Unity 获取手机地理位置信息

这篇具有很好参考价值的文章主要介绍了Unity 获取手机地理位置信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.location.status == LocationServiceStatus.Running)
        {
            OnUpdate(Input.location.lastData);
        }
#if UNITY_ANDROID && !UNITY_EDITOR
        if (UnityEngine.Android.Permission.HasUserAuthorizedPermission(UnityEngine.Android.Permission.FineLocation))
        {
            StartGPS();
        }
#endif
    }

    /// <summary>
    /// 申请权限
    /// </summary>
    public static void RequestPermission()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        string 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信息和自己创建的密钥发送给后台,后台返回对应的国家城市信息,按照指定的格式进行解析就可以了,这里就不过多介绍了。

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

尾语

如果有写的不好的地方,欢迎各位大佬批评指正。文章来源地址https://www.toymoban.com/news/detail-531841.html

到了这里,关于Unity 获取手机地理位置信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (Java版)根据ip获取地理位置以及相关信息

    1.首先我们需要进入地图开放平台的官网,根据提示注册账号,以百度地图为例: https://lbsyun.baidu.com/ 我们新用户登录之后会弹出这个页面,选择个人爱好者进入完成注册 成功之后我们会进入到下面这个页面,如果没有申请ak的小伙伴在控制台看板这一块是有一个流程指引的

    2024年02月08日
    浏览(36)
  • uni-app获取手机号-获取用户地理位置-根据位置获取经纬度跳转高德

    1.获取手机号首先要先登录拿到code,用code去获取session_key 2.获取 code需要知道自己的AppID(小程序ID)和AppSecret(小程序密钥) 3.解密后得到手机号  登录微信公众平台拿到自己的AppID(小程序ID)和AppSecret(小程序密钥)  微信公众平台  补充获取 code: 补充 获取openId: 获取session_key:

    2024年02月03日
    浏览(69)
  • 微信小程序通过startLocationUpdate,onLocationChange获取当前地理位置信息,配合腾讯地图解析获取到地址

    先创建个getLocation.js文件 在App.vue文件里引入封装的getLocation.js文件 要在manifest.json文件里配置下内容

    2024年02月03日
    浏览(59)
  • R语言【paleobioDB】——pbdb_collections_geo():从PBDB获取根据地理位置信息筛选的采集号的基本信息

    Package  paleobioDB  version 0.7.0 paleobioDB 包在2020年已经停止更新,该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后,执行本地安装。 参数【...】 :可通过 API 调用的参数。所有可用参数详见 PBDB Data Service: Single fossil collection。 根据参数发

    2024年01月22日
    浏览(35)
  • 使用uniapp开发获取地理位置

    老板要求做一个微信小程序,后面又希望能转为app. 所以选择了uniapp开发. 我的体验和感想就是以后不用uniapp了. 资源不多,学习了可能用处也不大.适合外包的干.这里写一下使用uniapp开发微信小程序获取地理位置 基本逻辑是使用uniapp的api首先获得地理经纬度位置等信息(在这之前

    2024年02月07日
    浏览(47)
  • Redis GEO地理位置信息的应用

    Redis的GEO操作是一种基于地理位置信息进行操作的功能。它使用经度和纬度坐标来表示地理位置,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。 1.GEOADD添加位置信息 将一个或多个指定的地理位置(经度、纬度、名称)添加到指定的键

    2024年02月08日
    浏览(48)
  • uniapp获取地理位置的API是什么?

    UniApp获取地理位置的API是 uni.getLocation 。它的作用是获取用户的当前地理位置信息,包括经纬度、速度、高度等。通过该API,开发者能够实现基于地理位置的功能,如显示用户所在位置附近的商家、导航服务、天气查询等。 以下是一个示例,展示如何使用uni.getLocation来获取用

    2024年02月07日
    浏览(39)
  • uniapp开发小程序如何获取用户地理位置

    1、需求说明 需求:点击按钮获取当前微信位置,以及点击拒绝授权后,下次点击还可以拉起授权窗口; 2、言归正传 1、编写代码 模板部分 script部分 2、在 manifest.json 新增如下配置 原因:因为微信小程序从2019年1月14日起新提交发布的版本若未填写地理位置用途说明,则将无

    2024年04月14日
    浏览(33)
  • 微信小程序 通过获取地理位置查看天气

      1.在app.json中写入 2.申请和风天气APIKEY 和风天气开发平台 ~ 高效强大的天气API,天气SDK和天气插件 3.在js文件中设置变量 4.获取天气代码  5.根据坐标获取城市  6.获取天气情况   结束啦。

    2024年02月09日
    浏览(66)
  • 微信小程序定位开发 逆地理位置查询 经纬度获取位置名称

    一. 微信小程序获取用户定位==经纬度(官方) (1)官方方法:wx.getLocation(Object object) (2)官方链接:https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.getLocation.html (3)关键点: 申请权限 :在小程序管理后台,「开发」-「开发管理」-「接口设置」中申请开通该接口权限。

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包