
오늘은 Reactive 프로그래밍과 관련된 것들을 배운다.
- 비동기 쓰레드처럼 동작하던 코루틴을 대체하는 기능인
UniTask- 절차지향, 객체지향같은 프로그래밍 패러다임 중 하나인 Reactive 프로그래밍을 유니티에서 가능케 하는 라이브러리인
UniRx- 종속성 주입으로 사용되는
Zenject오픈소스 깃허브 기능이다.
오늘은 비동기 함수를 수행하는 코루틴과 그것을 대체하는 UniTask를 알아본다.
기존에 사용하던 로직 분산 처리 기법. async/await 처럼 멀티 쓰레드를 사용하는 방식은 아니다. 실제로는 싱글 쓰레드로 전부 작업된다.
이러한 단점을 보완하고 나온 것이 UniTask다.
비동기식 프로그래밍, 리액티브 프로그래밍에 적합한 비동기식 로직 분산 처리 기능이다. 실제로 멀티쓰레드로 동작한다.
원래는 유니티 상에서는 async/await가 적절한 처리 방식이 아니다. 라이프 사이클 때문이다.
private async Task test()
{
await testFunction(); // 이렇게 하면 끝날 때까지 기다림
}
위와 같은 코드가 그냥 Unity에서는 되지 않는다.
이제 UniTask를 어떻게 사용하는 지 알아보자
private void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
Coroutine routine = StartCoroutine(CountDownRoutine());
}
}
IEnumerator CountDownRoutine()
{
WaitForSeconds wait = new WaitForSeconds(1f);
for(int count = 5; count >= 1; count --)
{
Debug.Log(count);
yield return wait;
}
}
코루틴은 반환도 코루틴이다.
UniTask는 반환형을 가질 수 있다. void형을 반환하고자 한다면, UniTaskVoid로 넣으면 된다.private void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
bool result = CountDownTask();
}
}
private async UniTask<bool> CountDownTask()
{
for(int count = 5; count >= 1; count--)
{
Debug.Log(count);
await UniTask.WaitForSeconds(1f);
}
return true;
}
UniTask는 구조체이기 때문에, 스택영역에서 형성된다. 그러므로 가비지 컬렉션이 작동하지 않는다.
yield return FirebaseApp....();
await FirebaseApp....();
코루틴의 경우, 분산 처리를 할 때 하나하나 끝날 때까지 기다려야 된다. CSV를 링크를 통해 전부 받는다 해보자.
var task 1 = UnityWebRequest.Get("");
var task 2 = UnityWebRequest.Get("");
var task 3 = UnityWebRequest.Get("");
yield return task1;
yield return task2;
yield return task3;
var task1 = GetTextAsync(UnityWebRequest.Get(path));
var task2 = GetTextAsync(UnityWebRequest.Get(path));
var task3 = GetTextAsync(UnityWebRequest.Get(path));
await UniTask.WhenAll(task1, task2, task3);