개발/Unity
유니티 - 위도, 경도, 고도 찾기 (Get GPS Information about latitude, longitude, altitude)
피로물든딸기
2023. 6. 27. 20:05
반응형
참고
- https://docs.unity3d.com/ScriptReference/LocationService.Start.html
유니티에서 위도(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 정보를 확인할 수 있다.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
반응형