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));
'Unity' 카테고리의 다른 글
Dotween Custom 해보기 (0) | 2023.08.09 |
---|---|
[Unity] Spine Component가 에디터 밖에 들어갔다오면 기본값으로 수정되는 현상 (0) | 2023.08.05 |
[Unity] FlatBuffer 최신화 하기 (0) | 2023.07.29 |
FireBase Sdk 10.2 업데이트때 발생하는 문제 (0) | 2023.07.27 |
프로그래머를 위한 워크플로 속도 향상 팁 (0) | 2023.07.26 |