Установите пакет UPM со ссылкой на git или пакет ресурсов UniTask/releases .
// extension awaiter/methods can be used by this namespace
using Cysharp.Threading.Tasks;
// You can return type as struct UniTask<T>(or UniTask), it is unity specialized lightweight alternative of Task<T>
// zero allocation and fast excution for zero overhead async/await integrate with Unity
async UniTask<string> DemoAsync()
{
// Вы можете ожидать объект AsyncObject
var asset = await Resources.LoadAsync<TextAsset>("foo");
var txt = (await UnityWebRequest.Get("https://...").SendWebRequest()).downloadHandler.text;
await SceneManager.LoadSceneAsync("scene2");
// .WithCancellation включает Cancel, GetCancellationTokenOnDestroy синхронизируется со временем жизни GameObject
// после Unity 2022.2 вы можете использовать `destroyCancellationToken` в MonoBehaviour
var asset2 = await Resources.LoadAsync<TextAsset>("bar").WithCancellation(this.GetCancellationTokenOnDestroy());
// .ToUniTask принимает обратный вызов прогресса (и все параметры), Progress.Create — это облегченная альтернатива IProgress<T>
var asset3 = await Resources.LoadAsync<TextAsset>("baz").ToUniTask(Progress.Create<float>(x => Debug.Log(x)));
// await кадровая операция, как сопрограмма
await UniTask.DelayFrame(100);
// замена yield return new WaitForSeconds/WaitForSecondsRealtime
await UniTask.Delay(TimeSpan.FromSeconds(10), ignoreTimeScale: false);
// вывести любой тайминг(PreUpdate, Update, LateUpdate, etc...)
await UniTask.Yield(PlayerLoopTiming.PreLateUpdate);
//замена yield return null
await UniTask.Yield();
await UniTask.NextFrame();
// замена WaitForEndOfFrame
#if UNITY_2023_1_OR_NEWER
await UniTask.WaitForEndOfFrame();
#else
// требует MonoBehaviour(CoroutineRunner))
await UniTask.WaitForEndOfFrame(this); // this is MonoBehaviour
#endif
// замена of yield return new WaitForFixedUpdate(same as UniTask.Yield(PlayerLoopTiming.FixedUpdate))
await UniTask.WaitForFixedUpdate();
// waits for 3 second
await UniTask.Delay(3000);
// замена of yield return WaitUntil (ждем пока делегат станет true)
await UniTask.WaitUntil(() => isActive == false);
// специальный помощник WaitUntil
await UniTask.WaitUntilValueChanged(this, x => x.isActive);
// Вы можете ожидать сопрограммы IEnumerator
await FooCoroutineEnumerator();
// Вы можете подождать стандартную задачу
await Task.Run(() => 100);
// Многопоточность, запуск на ThreadPool под этим кодом
await UniTask.SwitchToThreadPool();
/* work on ThreadPool */
// return to MainThread(same as `ObserveOnMainThread` in UniRx)
await UniTask.SwitchToMainThread();
// получить асинхронный веб-запрос
async UniTask<string> GetTextAsync(UnityWebRequest req)
{
var op = await req.SendWebRequest();
return op.downloadHandler.text;
}
var task1 = GetTextAsync(UnityWebRequest.Get("http://google.com"));
var task2 = GetTextAsync(UnityWebRequest.Get("http://bing.com"));
var task3 = GetTextAsync(UnityWebRequest.Get("http://yahoo.com"));
// одновременное асинхронное ожидание и простое получение результатов с помощью синтаксиса кортежа
var (google, bing, yahoo) = await UniTask.WhenAll(task1, task2, task3);
// сокращение от WhenAll, кортеж может ожидать напрямую
var (google2, bing2, yahoo2) = await (task1, task2, task3);
// вернуть асинхронное значение. (или можно использовать `UniTask` (нет результата), `UniTaskVoid` (выполнить и забыть)).
return (asset as TextAsset)?.text ?? throw new InvalidOperationException("Asset not found");
}
Подробнее: https://github.com/Cysharp/UniTask