UniTask 와 코루틴을 비교해서 설명하면 이해가 쉽다고 합니다.
UniTask
Unity 에서 사용하는 Task 대체 라이브러리라서 UniTask 라고 부릅니다.
C# 의 async/await 구문을 좀 더 유니티에 최적화해 사용할 수 있게 해줍니다.
아래 깃허브 링크입니다.
https://github.com/Cysharp/UniTask
GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity.
Provides an efficient allocation free async/await integration for Unity. - Cysharp/UniTask
github.com
System.Threading.Tasks
Task 는 기본적으로 ThreadPool (쓰레드풀) 에서 작동합니다.
Task.Run( 어쩌구 ) 으로 새 작업이 큐에 올라가면 적당한 쓰레드에서 실행된 뒤,
await 가 그 작업이 끝날 때까지 기다렸다가 이어서 코드를 실행합니다.
박싱/언박싱으로 메모리 할당이 많아 GC 부담이크며, 유니티의 메인 스레드 특징 때문에
UniTask 를 사용하게 됩니다.
Coroutine vs UniTask
먼저 아래 코루틴 예제부터 살펴보겠습니다.
우선 StartCoroutine(StartAsync()); 했다고 가정해봅시다.
IEnumerator StartAsync()
{
yield return new WaitForSeconds(10.0f);
Debug.Log("10초 기다림");
}
코루틴은 익숙하고 Unity 에 기본으로 제공되기 때문에, 간단한 작업에서는 매우 유용하게 사용됩니다.
특히 yield return 으로 시간 딜레이를 주며 액션을 취하기 용이합니다.
하지만, 반환값이 없고, 수동으로 관리해야 하는 (StopCoroutine) 작업이 필요합니다.
특히 StartCoroutine 할 때마다 GC 메모리 소모량이 크다고합니다.
다음은 UniTask 입니다.
private async UniTaskVoid StartAsync()
{
await UniTask.Delay(TimeSpan.FromSeconds(10));
Debug.Log("10초 기다림");
}
조금 더 복잡한 로직에서는 병렬처리가 필요할 때 유니테스크를 사용하면 좋습니다.
코루틴과는 다르게 반환값을 쓸 수 있고, GC 의 부하가 덜 하다고 합니다.
또한, async / await 문법은 익숙해지면 가독성면에서 이점을 볼 수 있습니다.
- async : 이 함수는 비동기적으로 동작한다는 뜻
- await : 이 작업 끝날 때까지 기다린다는 뜻 (하지만 다른 작업들은 돌아가용)
Delay
위의 코드와 같이 유니티의 WaitForSeconds 랑 거의 비슷합니다.
코루틴은 yield return new WaitForSeconds(10.0f); 라고 쓴다면,
유니테스크는 await UniTask.Delay(TimeSpan.FromSeconds(10)); 과 같이 문법이 대응됩니다.
CancellationToken
예를들어, 씬이 이동되어 로딩중 작업을 멈추고 싶게된다면,
혹은 버튼을 눌러 중간에 다시 취소하는 중단 작업이 필요할 경우나
게임 오브젝트가 Destroy 되는 상황에서 등등 사용할 수 있는 것입니다.
코드로 보겠습니다.
private CancellationTokenSource _cts;
public async UniTaskVoid StartLoadingAsync()
{
_cts = new CancellationTokenSource();
try
{
await UniTask.Delay(5000, cancellationToken: _cts.Token);
Debug.Log("5초 다 기다림 완료");
}
catch (OperationCanceledException)
{
Debug.Log("로딩 취소");
}
}
public void CancelLoading()
{
_cts?.Cancel();
}
먼저 CancellationTokenSource 로 토큰을 만듭니다.
그 다음 UniTask 쪽으로 전달합니다. (위에 cancellationToken: _cts.Token)
중간에 오퍼레이션이 중단되어 catch 문의 예외로 줄이 이동합니다.
아래 하나 더 보겠습니다.
CancellationToken token = this.GetCancellationTokenOnDestroy();
await UniTask.Delay(7000, cancellationToken: token);
위 코드를 가진 게임 오브젝트가 7 초가 되기전, 4초에 Destory 되어버렸다고 하면,
GetCancellationTokenOnDestroy() 덕분에 안전하게 취소가 되었음을 확인할 수 있습니다.
( -> 왜냐, 오브젝트가 파괴되어도 await 가 계속 실행되면 안되기 때문에! )
추가
아니면, Cancel() 메서드를 만들어서 명시적으로도 가능할 것 같습니다.
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
CTS 를 만들어 줍니다.
await UniTask.Delay(5000, cancellationToken: token);
token 을 넘겨줍니다.
cts.Cancel(); // 딜레이 중단
필요한 곳에서 캔슬 메서드를 불러옵니다.
이렇게 사용이 가능할지는 정확히 잘 모르겠습니다.
아웅 피곤해
오늘도 좋은 하루 되세요~ ⌯˃ ᵕ ˂⌯ಣ
참고 : https://velog.io/@mayostar0514/UniTask%EC%9C%A0%EB%8B%88%ED%85%8C%EC%8A%A4%ED%81%AC
UniTask [유니테스크] 사용하기
라이브러리 유니테스크와 관련된 문서입니다.
velog.io
'- Unity > let us all UNITE !' 카테고리의 다른 글
| [Unity] UniTask 의 토큰 Token (= CancellationToken) (1) | 2025.10.07 |
|---|---|
| [Unity, C#] Singleton 싱글톤 (0) | 2025.09.07 |
| [Unity] UniTask (0) | 2025.07.03 |
| [Unity] NGUI (0) | 2025.07.02 |
| [Unity] (0) | 2025.06.21 |