본문 바로가기
유니티 최고/유니티 구현

유니티(Unity) 모바일 GPS 위도 경도 받아오기

by Lee_story_.. 2023. 3. 13.
728x90

최근 새로운 팀 프로젝트를 시작하게되어 구현하다 보니

 

모바일에서 GPS 정보를 받아오는 기능이 필요하여 정리해보았습니다. 

 

정보를 불러오는것 까지는 그렇게 어렵지 않지만 사용법에 대해서는 정보가 부족하네요... 

이부분에 대해서는 계속해서 글을 써보도록 하겠습니다!

 

 

이번에 참고한 블로그 내용입니다.

 

[Unity AR] GPS에 따른 위치 이동

1. 위도 경도 정보 가져오기

velog.io

 

코드의 구조는 위 블로그의 코드와 유사합니다!

 

 

하나하나씩 정리 해보겠습니다.

 

 

먼저 

GPS 정보를 저장할 변수들과 딜레이를 체크해줄 변수들을 선언

	public Text[] data = new Text[4];
    public float[] Gps_data = new float[2];

    public float delay;
    public float maxtime = 5.0f;

 

그리고 start 에서는 GPS를 검색해줄 코루틴을 돌려줍시다.

	private void Start()
    {
        StartCoroutine(Gps_man());
    }

 

코루틴에서는 먼저 모바일에서 GPS요청을 하는것 부터 시작하겠습니다.

	if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation)) // 권한 요청하기  // GPS 요청 
        {
            Permission.RequestUserPermission(Permission.FineLocation);
            while (!Permission.HasUserAuthorizedPermission(Permission.FineLocation))
            {
                yield return null;
            }
        }

Permission.HasUserAuthorizedPermission  >> 권한이 있는지 확인

(Permission.FineLocation)   >> 로케이션 / GPS 권한

Permission.RequestUserPermission  >> 권한 요청메세지 출력

 

 

GPS가 꺼져있는지 확인...

	if (Input.location.isEnabledByUser)
        {
            data[3].text = "GPS가 꺼져있습니다.";
        }

 

 

이제 GPS를 실행시키고 

	Input.location.Start();
        while (Input.location.status == LocationServiceStatus.Initializing && delay < maxtime)
        {
            yield return new WaitForSeconds(1.0f);
            delay++;
        }

        if (Input.location.status == LocationServiceStatus.Failed || Input.location.status == LocationServiceStatus.Stopped)
        {
            data[3].text = "위치정보를 가져오는데 실패...";
        }
        if (delay >= maxtime)
        {
            data[3].text = "지연시간 초과";
        }

Input.location.status >> 현재 상태

LocationServiceStatus.Initializing >> 초기화값

 >> 현재 GPS 상태가 초기화값이라면...  delay ++ 해주며 다시돌리기 

 

LocationServiceStatus.Failed >> 불러오기 실패

LocationServiceStatus.Stopped >> 정지

>> 실패 텍스트 출력

 

 

그리고 각각 위도, 경도, 고도 출력

	data[0].text = "위도 : " + (Input.location.lastData.latitude).ToString();
        data[1].text = "경도 : " + (Input.location.lastData.longitude).ToString();
        data[2].text = "고도 : " + (Input.location.lastData.altitude).ToString();

 

마지막으로 수집완료 텍스트를 출력후 1초마다 재시작하게 코루틴을 구성해줍시다!

	data[3].text = "위치 정보 수집 완료";


        yield return new WaitForSeconds(1.0f);

 

여기까지 실행하면 

아래 사진처럼 현재 위치의 정보가 나오게 됩니다!!!

 

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine.UI;
using UnityEngine;
using UnityEngine.Android;

public class GPSlocation : MonoBehaviour
{
    public Text[] data = new Text[4];
    public float[] Gps_data = new float[2];

    public float delay;
    public float maxtime = 5.0f;

    public bool receiveGPS = false;

    private void Start()
    {
        StartCoroutine(Gps_man());
    }

    IEnumerator Gps_man()
    {
        if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation)) // 권한 요청하기  // GPS 요청 
        {
            Permission.RequestUserPermission(Permission.FineLocation);
            while (!Permission.HasUserAuthorizedPermission(Permission.FineLocation))
            {
                yield return null;
            }
        }


        if (Input.location.isEnabledByUser)
        {
            data[3].text = "GPS가 꺼져있습니다.....";
        }

        Input.location.Start();
        while (Input.location.status == LocationServiceStatus.Initializing && delay < maxtime)
        {
            yield return new WaitForSeconds(1.0f);
            delay++;
        }

        if (Input.location.status == LocationServiceStatus.Failed || Input.location.status == LocationServiceStatus.Stopped)
        {
            data[3].text = "위치정보를 가져오는데 실패.....";
        }
        if (delay >= maxtime)
        {
            data[3].text = "시간 초과";
        }


        receiveGPS=true;
        data[3].text = "GPS 준비완료";

        while (receiveGPS)
        {
            data[0].text = "위도 : " + (Input.location.lastData.latitude).ToString();
            data[1].text = "경도 : " + (Input.location.lastData.longitude).ToString();
            data[2].text = "고도 : " + (Input.location.lastData.altitude).ToString();

            Gps_data[0] = Input.location.lastData.latitude;//위도
            Gps_data[1] = Input.location.lastData.longitude; //경도

            yield return new WaitForSeconds(1.0f);
        }
    }
}

 

 

 

 

 

 

잘 나오는것 같네요!!

 

 

틀린점이 있다면 댓 달아주세요!

댓글