跳至主要内容

UniTask

Github: https://github.com/Cysharp/UniTask
Licenece: MIT License.
Install from git url: https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask

簡介

簡單來說可以用C# async/await 去取代原本Unity中需要用Coroutine的地方,
好處:

  • 不需要有Monbehavior (改善整體架構、Editor也能用)
  • Code寫起來比較乾淨好看

基礎用法

單一等待

// 用Addressables的初始化示範
public async void InitAsync(Action<bool> _callback) {
AsyncOperationHandle<IResourceLocator> handle = Addressables.InitializeAsync();//先初始化
await handle;
_callback?.Invoke(handle.Status);
}

帶回傳值的Async function

// 用Addressables的初始化示範
public override async UniTask<bool> InitAsync() {
AsyncOperationHandle<IResourceLocator> handle = Addressables.InitializeAsync();//先初始化
await handle;
return handle.Status == AsyncOperationStatus.Succeeded;
}

一次等待多個UnTask,並取得所有回傳值

public async void InitAsync(Action _callback) {
List<UniTask<bool>> initTaskList = new List<UniTask<bool>>();
initTaskList.Add(InitAsync());
initTaskList.Add(OtherAsyncFunc1());
initTaskList.Add(OtherAsyncFunc2());
initTaskList.Add(OtherAsyncFunc3());
bool[] results = await UniTask.WhenAll(initTaskList);
_callback?.Invoke();
}

更多用法

更多用法請參考Github https://github.com/Cysharp/UniTask

  • 相較Unity Coroutine,try-catch寫起來也更方便
  • Timeout handling
  • Progress
  • ...

Reference

UniTask