JJB's gloomy DEV

[Unity3D/UniTask] UniTask 비동기 로딩 처리 방법 - JJB.

by JJB.

UniTask

UniTask의 경우 Coroutine과 비교가 많이 되는데, UniTask의 장점에 대해서는 다음에 작성해보도록 하고 일단 사용법에 대해서 설명드리겠습니다.

 

순서가 있는 로딩

using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;

public class AsyncLoading : MonoBehaviour
{
    void Start()
    {
        StartLoading().Forget();
    }


    private async UniTask StartLoading ()
    {
        // 씬로드 
        await OnSceneAsync();
        // 테이블 로드
        await OnLoadTableAsync();
        // 리소스 로드
        await OnLoadResourceAsync();
        // LoadingComplete!
    }
    
    
    private async UniTask OnSceneAsync()
    {
        await SceneManager.LoadSceneAsync("SceneName", LoadSceneMode.Additive);
    }

    private async UniTask OnLoadResourceAsync()
    {
        await Resources.LoadAsync("cube");
    }
    
    private async UniTask OnLoadTableAsync()
    {
        await Resources.LoadAsync("Table");
    }
    
}

로딩의 순서가 필요하다면 위 StartLoading 함수처럼 Scene로딩 -> 테이블 로딩 -> 리소스 로딩 형태로 순서를 정해 로딩을 해주면 됩니다.

 

순서가 없는 로딩

private async UniTask StartLoading ()
{
    await UniTask.WhenAll(OnSceneAsync(), OnLoadResourceAsync(), OnLoadTableAsync());
}

로딩 순서가 필요없다면, UniTask.WhenAll 함수를 통해 한번에 로딩을 건 후 로딩이 완료 처리될 때까지 대기해주면 됩니다.

 

Progress Bar

private async UniTask StartLoading ()
{
    List<UniTask> loadingTasks = new List<UniTask>();
    loadingTasks.Add(UniTask.Defer(OnSceneAsync));
    loadingTasks.Add(UniTask.Defer(OnLoadResourceAsync));
    loadingTasks.Add(UniTask.Defer(OnLoadTableAsync));

   
    foreach (var task in _loadingTasks)
    {
    	await task;
        // Task 로딩 완료
 	} 
}

progress bar를 구현 할 때, 로드할 최대 개수와 로드 된 개수를 알아야 합니다.

(List의 Count는 최대 개수, await 아래가 현재 로드된 개수로 표현할 수 있습니다)

이때 UniTask.Defer 함수를 활용하면 쉽게 해결이 가능한데, Defer 함수는 await 키워드를 만났을 때 함수를 실행시켜줍니다.

 

마치며

UniTask를 활용한 비동기 로딩 기법에 대해서 간단하게 몇 가지 적어 보았는데요.

UniTask는 장점도 많고, 사용법도 간편해서 비동기 처리가 필요할 때 꼭 한번 써보시는 걸 추천드립니다.

https://github.com/Cysharp/UniTask#getting-started

 

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

 

 

 

'Unity3D' 카테고리의 다른 글

[Unity3D/Editor] 커스텀에디터 활용기 1편 - JJB.  (0) 2022.06.04

블로그의 정보

JJB's gloomy DEV

JJB.

활동하기