부트캠프/Unity [ 스파르타 ]

[스파르타 ][TIL] 유니티 스파르타 7기 45일차 - UniTask

맏난거 2025. 4. 14. 22:56

✅ UniTask란?

UniTask는 Unity에서 Task 기반의 비동기 처리를 효율적으로 수행할 수 있도록 만든 경량 비동기 라이브러리입니다. C# async/await 문법을 Unity 환경에서 문제없이 사용할 수 있도록 최적화되어 있습니다.

✅ UniTask의 주요 특징

경량화 System.Threading.Tasks.Task보다 메모리 할당이 적고, GC를 덜 발생시킴
Unity 최적화 WaitForSeconds, YieldInstruction, AsyncOperation 등을 await으로 사용 가능
일시 중단 가능 Unity 라이프사이클(예: Update, LateUpdate) 내에서 깔끔하게 사용 가능
await 지원 일반 C#처럼 await 키워드를 통해 비동기 흐름 제어 가능
다양한 확장 Delay, NextFrame, WaitUntil, CancellationToken 등 다양한 API 제공

✅ UniTask 사용 예시

using Cysharp.Threading.Tasks;
using UnityEngine;

public class Example : MonoBehaviour
{
    private async void Start()
    {
        Debug.Log("1초 대기 전");
        await UniTask.Delay(1000); // 1초 대기
        Debug.Log("1초 대기 후");

        await UniTask.WaitUntil(() => Input.GetKeyDown(KeyCode.Space));
        Debug.Log("스페이스바 눌림");
    }
}

✅ 코루틴(Coroutine)과 UniTask 비교

문법 스타일 IEnumerator + yield return async/await
가독성 복잡한 흐름에서 어려움 명확한 흐름 처리 가능
예외 처리 try-catch 사용 어려움 try-catch로 깔끔하게 가능
반환값 처리 불가 (IEnumerator는 리턴 못함) UniTask<T>로 값 반환 가능
병렬 처리 병렬 처리가 어려움 WhenAll, WhenAny 등 병렬 처리 쉬움
성능 상대적으로 GC 발생 적음 UniTask는 매우 가볍게 설계됨
Unity 기본 지원 Unity 기본 기능 외부 패키지 설치 필요
Unity 관련 대기 WaitForSeconds, WaitUntil 등 UniTask.Delay, UniTask.WaitUntil 등

✅ 언제 UniTask를 쓰면 좋을까?

  • await 문법으로 비동기 흐름을 간결하게 표현하고 싶을 때
  • 값을 반환해야 하는 비동기 로직이 있을 때
  • 복잡한 코루틴 체인을 간결하게 정리하고 싶을 때
  • 비동기 병렬 처리(WhenAll, WhenAny)를 하고 싶을 때

✅ 언제 Coroutine을 계속 써도 괜찮은가?

  • 간단한 타이밍 제어 (ex: yield return new WaitForSeconds(1f);)
  • 외부 패키지를 설치하고 싶지 않을 때
  • 기존 프로젝트가 전부 Coroutine 기반일 때 (호환성 유지 차원)

코루틴이 직관적이고 간편해서 좋긴하지만 UniTask로 이용해서 가비지 컬렉터를 안생기게 하는것도 좋은 방법이라

상황에 따라서 사용하는게 좋았다