본문 바로가기
- Unity/let us all UNITE !

[Unity] UniTask

by david_동근 2025. 7. 10.

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