Установите пакет 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

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *