부트캠프/Unity [ 스파르타 ]
[스파르타 ][TIL] 유니티 스파르타 7기 45일차 - UniTask
맏난거
2025. 4. 14. 22:56
✅ UniTask란?
UniTask는 Unity에서 Task 기반의 비동기 처리를 효율적으로 수행할 수 있도록 만든 경량 비동기 라이브러리입니다. C# async/await 문법을 Unity 환경에서 문제없이 사용할 수 있도록 최적화되어 있습니다.
- 공식 GitHub: https://github.com/Cysharp/UniTask
- 만든 사람: Cysharp (모던 C# 기능을 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로 이용해서 가비지 컬렉터를 안생기게 하는것도 좋은 방법이라
상황에 따라서 사용하는게 좋았다