[Unity]날씨 API 연동하면서 UnityWebRequest 알아보기

·2024년 6월 30일
0

Unity

목록 보기
5/11

이번에는 외부 API를 유니티에 연동해서 원하는 데이터를 가져오면 좋겠다는 생각이 들어서 시작하게 되었다.

사실 API를 연동하는일은 처음이었던터라 유니티내의 어떤 클래스로 데이터를 가져와야하는지 고민이 되어 구글링을 했고 결론적으로 UnityWebRequest 라는 클래스를 사용해주면 된다

🌁날씨 API 가져오기!

좋은 무료 API인 https://openweathermap.org/ 에서 가입을 한 뒤,원하는 데이터를 선택해서 subscribe를 눌러주면 본인에게 맞는 라이센스를 눌러주면 구독 완료! (쉽습니다...)
물론 나는 Free인간...ㅎ
구독을 정상적으로 마치고 My API keys에 들어가면 원하는 데이터에 접근할 수 있는 API키가 active하게 발급되어있을 것이고 이를 Docs에 맞춰 URL에 기입해주면 된다.

현재 Doc에는 이렇게 경도와 위도를 입력하여 원하는 위치의 날씨데이터를 불러오라고 하지만 그냥 url의 ?뒤에 q="위치"&appid=""로 바꿔줘도 정상적으로 인식한다.

🤓데이터를 유니티에 가져오기

앞에서 원하는 데이터에 정상적으로 접근이 가능하게 되었으니 이것은 유니티로 가져와보겠다
그러기 위해서는 UnityWebRequest클래스를 활용하면 된다.
더불어 데이터를 다 불러온 시기에 맞춰 콜백함수를 호출시키기 위해 코루틴으로 제작할 것이다.

string API_ADDRESS = @"api.openweathermap.org/data/2.5/weather?q=Seoul&appid=";
public string APP_ID; // Inspector에 입력

//void Start() ---------------------------------------
API_ADDRESS += APP_ID;	

//IEnumerator 날씨 정보 다운로드() --------------------------------
UnityWebRequest webRequest = UnityWebRequest.Get(API_ADDRESS);
yield return webRequest.SendWebRequest();

Get함수로 설정한 URL에 대해 서버로 request를 보낸 후, 결과를 받을 때까지 대기한다.
대기가 종료되고 반환된 결과에 대해 에러를 확인하는 과정을 거친다.

//만약 에러가 있을 경우
if (webRequest.result == UnityWebRequest.Result.ProtocolError
|| webRequest.result == UnityWebRequest.Result.ConnectionError)
{
     Debug.Log(webRequest.error);
     yield break;
}

//다운로드 완료
string downloadedTxt = webRequest.downloadHandler.text;

downloadHandler를 통해 수신한 데이터를 string 타입으로 읽으면 유니티 내부로 가져오기 완료!😊

🗂️유니티에서 json 형식의 데이터 다루기

유니티에서 JsonUtility라는 json 직렬화 유틸리티가 있기에 원하는 형식으로 파싱하는 과정을 편안하다.
🔗 Unity Json 직렬화 도큐먼트 바로가기
일단 원하는 데이터의 json 구조를 파악하고 그에 따른 [Serializable] class를 생성해 파싱될 구조를 생성한다.
날씨 API 도큐먼트에서 제공하는 json은 이렇게 나와있다고 한다.

json을 원하는 데이터 구조로 변환하는 함수인 FromJson 사용
반대는 ToJson이 있다.

WeatherData _weatherData = JsonUtility.FromJson<WeatherData>(weatherStr);

👩🏻‍💻날씨를 Text object에 간단하게 노출시키기

이 데이터를 받은 후 callback 함수를 호출하여 날씨를 Text 오브젝트에 보여준다.
그러기 위해 프로젝트를 시작할 때 delegate를 사용하여 원하는 함수들을 chain 걸어준다.

public Text txt;
txt.text = "날씨를 불러오는 중 입니다.";

public delegate void WeatherDataCallback(WeatherData weatherData);
WeatherDataCallback fillTxt;

fillTxt = new WeatherDataCallback(ConvertTempToCelsius);
fillTxt += new WeatherDataCallback(Fill);

// 코루틴 실행
// weatherData에 데이터 저장 이후 아래 콜백 코드 실행
fillTxt(weatherData);

public void ConvertTempToCelsius(WeatherData weatherData)
{	// default : kelvin
    weatherData.main.temp -= 273.15f;
}
public void Fill(WeatherData weatherData)
{
    txt.text = weatherData.main.temp.ToString();
}

▶️ 결과물

🍀 느낀점

처음으로 웹과 연동하여 데이터를 받아보는 실습을 해서 간단하더라도 좋은 개념을 배우고 delegate에 대해 더 알게 되어 좋은 호기심이 불러일으킨 경험이 됐다.

이제는 구글 시트를 유니티로 연동하여 서로 데이터를 일일이 주고 받을 필요없이 바뀐 데이터를 바로 다운 받아 사용할 수 있는 시스템을 해보고자 한다!

⬇️ 시스템 개발 완료 velog 보러가기
🔗 [Unity] GoogleSheet 데이터 가져와서 사용하기

profile
할 수 있는 최선을 다하는 클라이언트 개발자랍니다 (❁´◡`❁)

0개의 댓글

관련 채용 정보