본문 바로가기

Unity

UniTask 란?

UniTask란?

Unity에서 UniTask는 비동기 작업을 처리하기 위한 도구로, Unity의 코루틴 기능을 대체하며 async/await 패턴을 지원합니다.

일반적인 C#의 Task와 비교하여, UniTask는 Unity에서 더 효율적으로 동작하도록 설계되었으며, 주로 WebGL 빌드와 같은 플랫폼에서 기본 Task의 제한을 극복하기 위해 사용됩니다.

 UniTask를 사용하면 async/await 패턴을 활용하여 간결하고 명확한 비동기 코드를 작성할 수 있습니다.

 

unitask는 아래 깃허브에서 다운받을 수 있습니다!

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. - GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity.

github.com

 

 

 

private void Start()
{
​​​​StartCoroutine(CoroWait());
​​​​UniWait().Forget();
}

IEnumerator CoroWait()
{
​​​​yield return new WaitForSeconds(3f);
}

async UniTaskVoid UniWait()
{
​​​​await UniTask.Delay(TimeSpan.FromSeconds(3f));
}

주로 사용되는 WaitForSeconds에 대한 사용방법

await UniTask.Delay(TimeSpan.FromSeconds(3f), DelayType.UnscaledDeltaTime);

이렇게 하면 TimeScale을 무시한채 사용할 수 있는 방법 

 

private int count = 0;
IEnumerator CoroWait()
{
    
    yield return new WaitUntil(() => count == 7);
}

async UniTaskVoid UniWait()
{
    await UniTask.WaitUntil(()=> count ==  7);
}

특정 조건이 될 때까지 기다려야 하는 조건일 경우 

 

Tracker

코루틴을 말고 UniTask를 쓰는 장점은 바로 추적이 가능하다는 점입니다. 

바로 UniTask Tracker을 통해 진행되는 unitask가 어떻게 쓰이는지 추적을 할 수 있습니다 

Basic Examples

Unity's AsyncObject

var asset = await Resources.LoadAsync<TextAsset>("foo");

await SceneManager.LoadSceneAsync("scene2");
Delay

// 100 Frames
await UniTask.DelayFrame(100);

// 1000 ms
await UniTask.Delay(1000);

// replacement of yield return new WaitForSeconds/WaitForSecondsRealtime
await UniTask.Delay(TimeSpan.FromSeconds(10), ignoreTimeScale: false);
WaitUntil

// replacement of yield return WaitUntil
await UniTask.WaitUntil(() => isActive == false);

// special helper of WaitUntil
await UniTask.WaitUntilValueChanged(this, x => x.isActive);
IEnumerator coroutine

// You can await IEnumerator coroutine
await FooCoroutineEnumerator();
Standard Task

// You can await standard task
await Task.Run(() => 100);
WebRequest

// get async webrequest
async UniTask<string> GetTextAsync(UnityWebRequest req) {
    var op = await req.SendWebRequest();
    return op.downloadHandler.text;
}

var task1 = GetTextAsync(UnityWebRequest.Get("http://google.com"));
UniTask.WhenAll & UniTask.WhenAny

public async UniTaskVoid LoadManyAsync() {
    // parallel load.
    var (a, b, c) = await UniTask.WhenAll(
        LoadAsSprite("foo"),
        LoadAsSprite("bar"),
        LoadAsSprite("baz"));
}

async UniTask<Sprite> LoadAsSprite(string path) {
    var resource = await Resources.LoadAsync<Sprite>(path);
    return (resource as Sprite);
}
Timeout

// You can handle timeout easily
await GetTextAsync(UnityWebRequest.Get("http://unity.com"))
		.Timeout(TimeSpan.FromMilliseconds(300));