如何在Unity中申请定位权限并获取GPS数据存储至static变量
Unity移动端GPS定位实现指南(支持static变量存储)
高频踩坑原因说明
你之前使用官方示例无法将定位数据存入static变量,本质是两个新手常见问题:
- 定位初始化是异步协程执行逻辑,代码不会等待定位数据返回就继续往下走,在协程还没拿到有效定位值时读取static字段,拿到的永远是默认空值
- 移动端平台的基础定位权限没有提前在Player Settings中配置,导致定位服务根本无法启动,自然没有数据可以赋值
第一步:配置平台基础权限
不完成这一步,代码层面永远无法弹出系统权限申请弹窗,所有定位逻辑都会静默失败:
- Android平台:进入
Player Settings > Android > Other Settings,手动勾选ACCESS_FINE_LOCATION(精确定位)、ACCESS_COARSE_LOCATION(模糊定位)两个系统权限 - iOS平台:进入
Player Settings > iOS > Other Settings,在Location Usage Description栏填写权限申请时的提示文案,例如“需要获取您的位置信息以正常提供服务”
第二步:可直接运行的完整定位脚本
将下面的脚本挂载在场景中任意一个常驻对象上,脚本会自动完成权限检测、定位启动、static变量赋值的全流程:
using UnityEngine; using System.Collections; public class GPSLocationManager : MonoBehaviour { // 全局static存储的定位变量,其他脚本可直接读取 public static float CurrentLatitude = 0f; public static float CurrentLongitude = 0f; public static float CurrentAltitude = 0f; public static float HorizontalAccuracy = 0f; public static bool IsLocationReady = false; // 定位初始化等待超时时间,单位秒 public float locationTimeout = 10f; private void Start() { StartCoroutine(InitLocationService()); } private IEnumerator InitLocationService() { // 检查系统定位总开关是否开启 if (!Input.location.isEnabledByUser) { Debug.Log("请在设备系统设置中为应用开启定位权限"); yield break; } // 启动定位服务,设置1米精度、1米移动距离触发更新 Input.location.Start(desiredAccuracyInMeters: 1f, updateDistanceInMeters: 1f); // 等待定位服务完成初始化 int waitCount = 0; while (Input.location.status == LocationServiceStatus.Initializing && waitCount < locationTimeout) { waitCount++; yield return new WaitForSeconds(1); } // 异常分支处理 if (waitCount >= locationTimeout) { Debug.Log("定位服务初始化超时,请检查设备GPS信号强度"); Input.location.Stop(); yield break; } if (Input.location.status == LocationServiceStatus.Failed) { Debug.Log("定位服务启动失败,请检查平台权限配置"); yield break; } // 拿到有效定位数据后,赋值给static静态变量 LocationInfo currentInfo = Input.location.lastData; CurrentLatitude = currentInfo.latitude; CurrentLongitude = currentInfo.longitude; CurrentAltitude = currentInfo.altitude; HorizontalAccuracy = currentInfo.horizontalAccuracy; IsLocationReady = true; Debug.Log($"定位成功,当前坐标:纬度{CurrentLatitude}, 经度{CurrentLongitude}"); } // 应用退出时主动停止定位服务,减少不必要的耗电 private void OnApplicationQuit() { Input.location.Stop(); } }
结果验证说明
- 任意其他脚本不需要获取场景对象引用,直接通过类名即可读取static变量,例如调用
GPSLocationManager.CurrentLatitude - 定位数据不会在脚本启动的瞬间返回,根据设备GPS信号强度,一般需要等待1-3秒完成初始化;当控制台打印“定位成功”日志时,static变量的值才会被正式更新
- 如果一直无法拿到有效定位值,优先排查两个点:平台权限是否在Player Settings中完成配置、设备系统的定位总开关是否开启
内容的提问来源于stack exchange,提问作者Edward Pudas
相关产品推荐
相关产品推荐

