You need to enable JavaScript to run this app. 如何在Unity中申请定位权限并获取GPS数据存储至static变量
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 12:06:07