UniRx 의 ObservableWWW 은 매우 유용한 기능이지만 유니티 2018.3 이후 버전 부터는 실행시 아래와 같은 경고가 발생한다.
경고 CS0618 'ObservableWWW'은(는) 사용되지 않습니다. 'Use UnityWebRequest, a fully featured replacement which is more efficient and has additional features'
이는 Unity3D 에서 UnityEngine.WWW 가 deprecate 되면서 내부적으로 이를 사용하던 ObservableWWW 역시 obsolete 되었기 때문이다.
현재 유니티의 최신 버전인 2019.2 에서도 일단 작동 자체는 문제가 없지만 언제 기능이 삭제될지 알수 없기 때문에 가급적 수정해 주는 것이 좋다.
그렇다고 UnityWebRequest.Get 과 Coroutine 으로 돌아가기는 싫고 다른 방법을 찾아보았다.
UniTask 를 사용하자
UniTask 는 UniRx 를 만든 일본인 개발자가 CEO 로 있는 회사, Cysharp 에서 제작해 GitHub 에 오픈소스로 제공하고 있는 UniRx 기반의 유니티용 async / await 통합 패키지이다.
유니티에서도 이제는 async와 await 를 지원하기는 하지만 성능면이나 안정성 등에서 불안한 부분이 있어 그다지 사용하지 않는 듯하다.
이에 제작자는 '초궁극' 퍼포먼스의 유니티용 async / await 라이브러리를 만들었다고 한다.
(という長ったらしい前置きにより、つまり超究極パフォーマンスのUnityのasync/await統合を提供するライブラリを作りました。)
UniRx와 달리 에셋스토어에서 받을 수는 없고 GitHub에서 직접 다운로드 받아야 한다.
이 패키지를 유니티 프로젝트에 Import 하면 이름은 UniTask 지만 UniRx.Async 라는 폴더에 라이브러리가 설치 된다.
코드를 간단하게 살펴보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
using System;
using UnityEngine;
using UniRx.Async;
using UnityEngine.Networking;
public class UnityWebRequestSample : MonoBehaviour
{
async void Start()
{
var uri = "https://unity.com/";
try
{
var result = await GetTextAsync(uri);
Debug.Log(result);
}
catch (Exception e)
{
Debug.LogException(e);
}
}
/// <summary>
/// UnityWebRequest를 async/await 에서 대기
/// </summary>
private async UniTask<string> GetTextAsync(string uri)
{
var uwr = UnityWebRequest.Get(uri);
// SendWebRequest가 끝날 때까지 await
await uwr.SendWebRequest();
if (uwr.isHttpError || uwr.isNetworkError)
{
// 실패시 예외 throw
throw new Exception(uwr.error);
}
return uwr.downloadHandler.text;
}
}
|
c# |
UniTask 를 사용하기 위해서는 using UniRx.Async; 를 선언해 준다.
기존 코루틴을 활용할 때와 코드의 형태가 비슷하다.
만약 UniTask 가 아닌 IObservable 로 변환해서 사용하려면 ToObservable() 함수를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/// <summary>
/// UnityWebRequest를 내부적으로 사용한 Observable
/// </summary>
/// <param name="uri"></param>
/// <returns></returns>
private IObservable<string> GetTextObservable(string uri)
{
return GetTextAsync(uri).ToObservable();
}
/// <summary>
/// UnityWebRequest를 async/await에서 대기
/// </summary>
private async UniTask<string> GetTextAsync(string uri)
{
var uwr = UnityWebRequest.Get(uri);
// SendWebRequest가 끝날 때까지 await
await uwr.SendWebRequest();
if (uwr.isHttpError || uwr.isNetworkError)
{
// 실패시 예외 throw
throw new Exception(uwr.error);
}
return uwr.downloadHandler.text;
}
|
c# |
- UnityWebRequest을 사용한다면 UniTask의 async / await 를 사용하자.
- Observable 을 사용하려면 UniTask에서 ToOservable로 변환
댓글