개발/Unity

유니티 - 위도, 경도, 고도 찾기 (Get GPS Information about latitude, longitude, altitude)

피로물든딸기 2023. 6. 27. 20:05
반응형

Unity 전체 링크

 

참고

- https://docs.unity3d.com/ScriptReference/LocationService.Start.html

- OnGUI로 실시간 초당 프레임 수 확인하기

 

유니티에서 위도(latitude), 경도(longitude), 고도(altitude)에 대한 정보를 읽어보자.

유니티에서 제공하는 API 가이드를 참고하여 아래의 스크립트를 만들자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GetGPS : MonoBehaviour
{
    [Range(10, 150)]
    public int fontSize = 30;
    public Color color = new Color(.0f, .0f, .0f, 1.0f);
    public float width, height;
    string message = "-";

    public void getGPSInfo()
    {
        StartCoroutine(getGPSCoroutine());
    }

    IEnumerator getGPSCoroutine()
    {
        // Check if the user has location service enabled.

        if (!Input.location.isEnabledByUser)
        {
            message = "GPS is not enabled";
            yield break;
        }
       
        // Starts the location service.
        Input.location.Start();

        // Waits until the location service initializes
        int maxWait = 20;
        while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)
        {
            message = maxWait.ToString() + " wait...";
            yield return new WaitForSeconds(1);
            maxWait--;
        }

        // If the service didn't initialize in 20 seconds this cancels location service use.
        if (maxWait < 1)
        {
            message = "Timed out";
            print("Timed out");
            yield break;
        }

        // If the connection failed this cancels location service use.
        if (Input.location.status == LocationServiceStatus.Failed)
        {
            message = "Unabled to determine device location";
            print("Unable to determine device location");
            yield break;
        }
        else
        {
            // If the connection succeeded, this retrieves the device's current location and displays it in the Console window.
            message = "";
            latitude = Input.location.lastData.latitude;
            longitude = Input.location.lastData.longitude;
            altitude = Input.location.lastData.altitude;

            print("Location: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude + " " + Input.location.lastData.altitude + " " + Input.location.lastData.horizontalAccuracy + " " + Input.location.lastData.timestamp);
        }

        // Stops the location service if there is no need to query location updates continuously.
        Input.location.Stop();
    }

    float latitude, longitude, altitude;

    void OnGUI()
    {
        Rect position = new Rect(width, height, Screen.width, Screen.height);

        string text = string.Format(" {0:N5} \n {1:N5} \n {2:N5}\n {3}", latitude, longitude, altitude, message);

        GUIStyle style = new GUIStyle();

        style.fontSize = fontSize;
        style.normal.textColor = color;

        GUI.Label(position, text, style);
    }
}

 

OnGUI를 이용해 디버깅을 하도록 화면에 로그를 표시하였다.

N5는 소수점 5번째자리까지 출력하는 옵션이다.

string text 
    = string.Format(" {0:N5} \n {1:N5} \n {2:N5}\n {3}", latitude, longitude, altitude, message);

 

큐브를 만들고, 큐브에 스크립트를 추가하자.

그리고 버튼을 만들어서 getGPSInfo를 onClick 이벤트에 추가한다.

 

게임을 실행해도 PC에서는 GPS가 없기 때문에 값을 알 수 없다.

apk로 빌드하고 모바일에서 실행을 해보자.

하지만, 모바일에서도 GPS가 동작하지 않는다고 로그가 발생할 수 있다.

 

위와 같이 유니티 안드로이드에서 GPS 정보를 읽어올 수 없다면, 권한 설정을 확인해보자.

먼저 위치가 켜져있는지 확인하고, 꾸욱 눌러 오른쪽의 화면으로 이동해 앱 권한을 클릭한다.

 

위치가 켜져있더라도, 모든 앱이 기기의 위치에 액세스할 수 있는 것은 아니다.

거부됨 아래에 있는 유니티 앱을 클릭한다.

 

선택한 앱에서 이 앱의 위치 액세스 권한앱 사용 중에만 허용으로 변경한다.

 

다시 게임을 실행하면 정상적으로 GPS 정보를 확인할 수 있다.

 

반응형