UniTask란?
UniTask는 비동기 프로그래밍을 보다 쉽게 할 수 있도록 도와주는 라이브러리이다.
기본적으로 C#에서 제공하는 Task를 기반으로 하지만, 유니티 환경에 특화되어 있다.
UniTask는 유니티의 코루틴보다 빠르고, C#의 async/await 패턴을 활용할 수 있게 해준다.
따라서 더 간결하고 직관적인 코드 작성이 가능해진다.
UniTask의 장점
성능 향상 : UniTask는 코루틴보다 빠르게 동작한다. 이는 내부적으로 더 최적화된 구조를 사용하기 때문이다.
간결한 코드 : async / await 패턴을 사용함으로써, 비동기 코드를 동기 코드처럼 읽고 쓸 수 있다.
타입 안전성 : 제네릭 타입을 지원하여, 컴파일 타임에 타입 체크가 가능하다.
다양한 기능 : UniTask는 다양한 유틸리티 함수와 확장 메소드를 제공하여, 비동기 작업을 더욱 쉽게 관리할 수 있게 한다.
UniTask 설치 방법
우선 UniTask는 유니티 PackageManager에서 안보인다 따로 설치를 해줘야 하는데,
깃 허브에서 링크를 가져와 설치 해야한다.
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask
위의 링크를 복사해서
Add package from git URL... 을 클릭하고,
입력하면 설치가 된다.
UniTask 사용 방법
기본적인 사용 방법은 이렇다.
using Cysharp.Threading.Tasks;
using UnityEngine;
public class UniTaskExample : MonoBehaviour
{
void Start()
{
RunAsyncTask().Forget();
}
private async UniTaskVoid RunAsyncTask()
{
Debug.Log("작업 시작");
await UniTask.Delay(1000); // 1초 대기
Debug.Log("작업 종료");
}
}
위 코드에서 볼 수 있듯이, RunAsyncTask 메서드는 async 키워드와 함께 사용된다.
await UniTask.Delay(1000)를 통해 1초 동안 대기한 후, 작업이 종료된다.
Forget() 메서드는 UniTask의 결과를 무시하고 실행하도록 한다.
UniTask의 다양한 기능
UniTask는 기본적인 비동기 작업 외에도 여러 가지 유용한 기능을 제공한다. 몇 가지 주요 기능을 살펴보자.
지연 작업
지연 작업을 쉽게 구현할 수 있다. UniTask.Delay를 사용하여 일정 시간 동안 대기할 수 있다.
async UniTaskVoid ExampleWithDelay()
{
Debug.Log("지연 시작");
await UniTask.Delay(2000); // 2초 대기
Debug.Log("지연 종료");
}
주기적 반복
일정한 간격으로 반복되는 작업을 구현할 수 있다.
UniTask.Yield 와 UniTask.Delay 를 사용하여 반복 작업을 쉽게 작성할 수 있다.
async UniTaskVoid ExampleWithPeriodicTask()
{
while (true)
{
Debug.Log("주기적 작업 실행");
await UniTask.Delay(1000); // 1초마다 반복
}
}
타임아웃 기능
비동기 작업이 일정 시간 안에 완료되지 않으면 타임아웃을 발생시킬 수 있다.
이는 네트워크 요청 등 시간이 오래 걸릴 수 있는 작업에 유용하다.
async UniTaskVoid ExampleWithTimeout()
{
try
{
await UniTask.Delay(3000).Timeout(TimeSpan.FromSeconds(2));
}
catch (TimeoutException)
{
Debug.Log("타임아웃 발생");
}
}
위 예제에서는 3초 동안 대기하는 작업에 2초의 타임아웃을 설정하였다. 따라서 타임아웃이 발생하여 예외가 던져진다.
병렬 처리
여러 비동기 작업을 병렬로 처리할 수 있다.
UniTask는 WhenAll과 WhenAny 메서드를 제공하여 이러한 병렬 처리를 쉽게 구현할 수 있다.
WhenAll : 모든 작업이 완료될 때까지 대기한다.
async UniTaskVoid ExampleWithWhenAll()
{
await UniTask.WhenAll(Task1(), Task2(), Task3());
Debug.Log("모든 작업 완료");
}
async UniTask Task1() { await UniTask.Delay(1000); Debug.Log("Task1 완료"); }
async UniTask Task2() { await UniTask.Delay(2000); Debug.Log("Task2 완료"); }
async UniTask Task3() { await UniTask.Delay(1500); Debug.Log("Task3 완료"); }
WhenAny : 가장 먼저 완료된 작업을 기다린다.
async UniTaskVoid ExampleWithWhenAny()
{
await UniTask.WhenAny(Task1(), Task2(), Task3());
Debug.Log("하나의 작업 완료");
}
UniTask취소 방법
CancellationToken 사용
CancellationTokenSource를 생성하여 CancellationToken을 얻고, 이를 비동기 작업에 전달한다.
필요할 때 CancellationTokenSource를 통해 작업을 취소할 수 있다.
using Cysharp.Threading.Tasks;
using UnityEngine;
using System.Threading;
public class CancellationTokenExample : MonoBehaviour
{
private CancellationTokenSource cts;
void Start()
{
cts = new CancellationTokenSource();
RunTaskWithCancellation(cts.Token).Forget();
}
void Update()
{
// 예를 들어, 스페이스 키를 누르면 작업을 취소한다.
if (Input.GetKeyDown(KeyCode.Space))
{
cts.Cancel();
}
}
private async UniTaskVoid RunTaskWithCancellation(CancellationToken token)
{
try
{
Debug.Log("작업 시작");
await UniTask.Delay(5000, cancellationToken: token);
Debug.Log("작업 완료");
}
catch (OperationCanceledException)
{
Debug.Log("작업 취소됨");
}
}
void OnDestroy()
{
// MonoBehaviour가 파괴될 때 취소 요청을 보낸다.
cts.Cancel();
cts.Dispose();
}
}
Unity 오브젝트와의 통합
게임 오브젝트가 파괴되거나 비활성화될 때 작업을 취소하는 방법도 있다.
유니티에서는 GetCancellationTokenOnDestroy와 GetCancellationTokenOnDisable을 사용하여
오브젝트의 생명주기에 따라 작업을 취소할 수 있다.
using Cysharp.Threading.Tasks;
using UnityEngine;
public class AutoCancellationExample : MonoBehaviour
{
void Start()
{
RunTaskWithAutoCancellation().Forget();
}
private async UniTaskVoid RunTaskWithAutoCancellation()
{
var cancellationToken = this.GetCancellationTokenOnDestroy();
try
{
Debug.Log("작업 시작");
await UniTask.Delay(5000, cancellationToken: cancellationToken);
Debug.Log("작업 완료");
}
catch (OperationCanceledException)
{
Debug.Log("작업 취소됨");
}
}
}
위 예제에서는 GetCancellationTokenOnDestroy 메서드를 사용하여 게임 오브젝트가 파괴될 때,
자동으로 작업이 취소되도록 설정하였다.
이 방법을 사용하면 CancellationTokenSource를 직접 관리하지 않아도 된다.
'Unity' 카테고리의 다른 글
Coroutine과 UniTask 비교 (0) | 2024.06.22 |
---|---|
Coroutine 사용 방법 (0) | 2024.06.18 |
FSM - State Pattern, State Machine 상태 패턴과 상태 머신, 유한 상태 기계 (1) | 2024.06.13 |
씬 변경을 해도 파괴되지 않는 오브젝트 만들기 (0) | 2024.06.10 |
Recorder 동영상 찍기 (0) | 2024.06.09 |