[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
'Unity3D' 카테고리의 다른 글
[Unity3D/Editor] 커스텀에디터 활용기 1편 - JJB. (0) | 2022.06.04 |
---|
블로그의 정보
JJB's gloomy DEV
JJB.